社区首页 >问答首页 >Hangfire -多租户,ASP.NET核心-解析正确的租户

Hangfire -多租户,ASP.NET核心-解析正确的租户
EN

Stack Overflow用户
提问于 2019-08-07 04:38:43
回答 1查看 4.9K关注 0票数 13

我有一个需要使用Hangfire的SaaS项目。我们已经实现了识别租户的要求。

体系结构

  • 持久化层
    • 每个租户都有自己的数据库

  • .NET核心
    • 我们已经有了一个服务TenantCurrentService,它从源主机名、查询字符串等列表中返回租户的ID。
    • 我们已经有了一个实体框架的DbContextFactory,它为客户端返回一个带有正确连接字符串的DB上下文
    • 我们目前正在使用ASP.NET核心DI (如果这有帮助的话愿意改变)

  • 汉火
    • 使用单个存储(例如: Postgresql),无论租户数量如何
    • 在适当的容器/ServiceCollection中执行作业,因此我们检索正确的数据库、正确的设置等。

问题

我正在尝试将一个TenantId标记为一个作业,从TenantCurrentService (它是一个作用域服务)中检索。

然后执行作业时,我们需要从作业中检索TenantId并将其存储在HangfireContext中,这样TenantCurrentService就知道从Hangfire检索到的TenantId了。然后,我们的应用层将能够从我们的DbContextFactory连接到正确的数据库。

电流状态

  • 目前,我们已经能够使用tenantId存储从服务中检索到的IClientFilter
  • 如何从.GetRequiredService().IdentifyTenant(tenantId) (负责检索已保存的作业参数)检索当前的ASP.NET核心DI ServiceScope,以便调用IServerFilter

有关于这件事的好文章吗?或者你们能提供的任何建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-07 06:19:54

首先,您需要能够在您的TenantId中设置TenantCurrentService。然后,您可以依赖于过滤器:

客户端(您在其中登记作业)

代码语言:javascript
代码运行次数:0
复制
public class ClientTenantFilter : IClientFilter
{
        public void OnCreating(CreatingContext filterContext)
        {
           if (filterContext == null) throw new ArgumentNullException(nameof(filterContext));

            filterContext.SetJobParameter("TenantId", TenantCurrentService.TenantId);
        }
}

和服务器端(作业退出队列的地方)。

代码语言:javascript
代码运行次数:0
复制
public class ServerTenantFilter : IServerFilter
{
    public void OnPerforming(PerformingContext filterContext)
    {
      if (filterContext == null) throw new ArgumentNullException(nameof(filterContext));

      var tenantId = filterContext.GetJobParameter<string>("TenantId");
      TenantCurrentService.TenantId = tenantId;
    }
}

当您通过IJobFilterProvider配置服务器时,可以声明服务器筛选器

代码语言:javascript
代码运行次数:0
复制
        var options = new BackgroundJobServerOptions
        {
            Queues = ...,
            FilterProvider = new ServerFilterProvider()
        };
        app.UseHangfireServer(storage, options, ...);

其中ServerFilterProvider是:

代码语言:javascript
代码运行次数:0
复制
public class ServerFilterProvider : IJobFilterProvider
{
    public IEnumerable<JobFilter> GetFilters(Job job)
    {
        return new JobFilter[]
                   {
                       new JobFilter(new CaptureCultureAttribute(), JobFilterScope.Global, null),
                       new JobFilter(new ServerTenantFilter (), JobFilterScope.Global,  null),
                   };
    }
}

可以在实例化BackgroundJobClient时声明客户端筛选器。

代码语言:javascript
代码运行次数:0
复制
var client = new BackgroundJobClient(storage, new BackgroundJobFactory(new ClientFilterProvider());

其中ClientFilterProvider作为ServerFilterProvider运行,传递客户端筛选器

一个困难可能是让TenantCurrentService在过滤器中可用。我想这应该可以通过在FilterProviders中注入工厂并将其链接到过滤器来实现。

我希望这能帮上忙。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57394712

复制
相关文章
(译)创建.NET Core多租户应用程序-租户解析
本系列博客文章探讨了如何在ASP.NET Core Web应用程序中实现多租户。这里有很多代码段,因此您可以按照自己的示例应用程序进行操作。在此过程的最后,没有对应的NuGet程序包,但这是一个很好的学习和练习。它涉及到框架的一些“核心”部分。
李明成
2020/04/07
2.5K0
多租户技术
多租户技术(Multi-TenancyTechnology)又称多重租赁技术,用于实现如何在多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。 具体的多租户隔离技术有多种,数据库通常有如下三种。 1. 独立数据库 这是第一种方案,即一个租户一个数据库。这种方案的用户数据隔离级别最高,安全性最好,但成本也高。 优点:为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求;如果出现故障,则恢复数据比较简单。 缺点:增大了数据库的安装数量,随之带来维护成本和购置
大数据和云计算技术
2018/03/08
7.1K0
多租户技术
多租户技术
独立数据库 这是第一种方案,即一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本也高。 优点: 为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求; 如果出现故障,恢复数据比较简单。 缺点: 增大了数据库的安装数量,随之带来维护成本和购置成本的增加。 这种方案与传统的一个客户、一套数据、一套部署类似,差别只在于软件统一部署在运营商那里。如果面对的是银行、医院等需要非常高数据隔离级别的租户,可以选择这种模式,提高租用的定价。如果定价较低,产品走低价路线,这种方案一般对运营商来说是无法承受的。 共享数据库,隔离数据架构 这是第二种方案,即多个或所有租户共享 Database,但是每个租户一个 Schema。 优点: 为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可以支持更多的租户数量。 缺点: 如果出现故障,数据恢复比较困难,因为恢复数据库将牵扯到其他租户的数据; 如果需要跨租户统计数据,存在一定困难。 共享数据库,共享数据架构 这是第三种方案,即租户共享同一个 Database、同一个 Schema,但在表中通过 TenantID 区分租户的数 据。这是共享程度最高、隔离级别最低的模式。 优点: 三种方案比较,第三种方案的维护和购置成本最低,允许每个数据库支持的租户数量最多。 缺点: 隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量; 数据备份和恢复最困难,需要逐表逐条备份和还原。 如果希望以最少的服务器为最多的租户提供服务,并且租户接受以牺牲隔离级别换取降低成本,这种方案最适合。
全栈程序员站长
2022/08/10
8600
多租户Kubernetes
Kubernetes Multitenancy WG Deep Dive KubeCon EU 2019 (last updated 5/22/2019) 描述了4种解决方案,并做了对比:
王磊-字节跳动
2020/02/13
3K0
[云计算架构:Dynamics ] 多租户 或多实例 ?
Dynamics 365(在线)为您提供了隔离Dynamics 365数据和用户访问权限的选项。 对于大多数公司而言,在订阅中添加和使用多个实例可提供正确的功能组合和易管理性。 具有不同地理位置的企业可能会考虑使用多个租户来分离Dynamics 365(在线)许可证。 多个实例可以在实例之间共享用户; 多个租户不能。
架构师研究会
2018/09/21
3.2K0
[云计算架构:Dynamics ] 多租户 或多实例 ?
ELK多租户方案
日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的;ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前的主流选择之一。
陶陶技术笔记
2020/12/11
2.6K0
ELK多租户方案
hibernate实现多租户[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105687.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/10
1.6K0
hibernate实现多租户[通俗易懂]
Byzer 多租户支持指南
用户可能通过 Byzer 的上层应用诸如 Notebook 进行任务的提交,任务会通过 Byzer Router 完成路由转发。
用户2936994
2022/05/08
8540
Byzer 多租户支持指南
HBase多租户系统设计
面向多租户的数据安全和资源隔离能力,提供标准的用户名密码认证、ACL、Quota、Resource Group等特性, 看到集群的容量状况,Server列表,表属性,表大小等等信息。在集群管理系统中,可以完成namespace管理、用户管理、ACL管理等功能
sparkle123
2021/01/13
1.1K0
(译)Istio 的软性多租户支持
多租户是一个在各种环境和各种应用中都得到了广泛应用的概念,但是不同环境中,为每租户提供的具体实现和功能性都是有差异的。Kubernetes 多租户工作组致力于在 Kubernetes 中定义多租户用例和功能。然而根据他们的工作进展来看,恶意容器和负载对于其他租户的 Pod 和内核资源的访问无法做到完全控制,因此只有“软性多租户”支持是可行的。
崔秀龙
2019/07/23
1.5K0
Spring Boot 构建多租户SaaS平台核心技术指南
笔者从2014年开始接触SaaS(Software as a Service),即多租户(或多承租)软件应用平台;并一直从事相关领域的架构设计及研发工作。机缘巧合,在笔者本科毕业设计时完成了一个基于SaaS的高效财务管理平台的课题研究,从中收获颇多。最早接触SaaS时,国内相关资源匮乏,唯一有的参照资料是《互联网时代的软件革命:SaaS架构设计》(叶伟等著)一书。最后课题的实现是基于OSGI(Open Service Gateway Initiative)Java动态模块化系统规范来实现的。
挨踢小子部落阁
2020/03/11
2.4K0
使用MyBatisPlus实现多租户功能
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/29
1.1K0
使用MyBatisPlus实现多租户功能
Zuul实现多租户架构(一)
Zuul是Netflix开源的微服务API网关,可以通过配置路由规则、过滤器等实现微服务的统一入口和出口。在多租户架构中,不同的租户需要访问不同的服务和资源,需要对Zuul进行定制化开发和配置。本文将介绍如何在Zuul中实现多租户架构,包括路由、过滤、认证和授权等方面。
堕落飞鸟
2023/04/10
6270
mybatis-plus 应用2:【常用的多租户方案对比,以及实现多租户功能】
就用school表举例,每一张数据库表都需要加上tenant_id这一列,记住是每一张,每一张,每一张
danielxiao
2022/08/16
2.5K0
Spring Boot 构建多租户SaaS平台核心技术指南
笔者从2014年开始接触SaaS(Software as a Service),即多租户(或多承租)软件应用平台;并一直从事相关领域的架构设计及研发工作。机缘巧合,在笔者本科毕业设计时完成了一个基于SaaS的高效财务管理平台的课题研究,从中收获颇多。最早接触SaaS时,国内相关资源匮乏,唯一有的参照资料是《互联网时代的软件革命:SaaS架构设计》(叶伟等著)一书。最后课题的实现是基于OSGI(Open Service Gateway Initiative)Java动态模块化系统规范来实现的。
JAVA葵花宝典
2020/03/10
2.7K0
Spring Boot 构建多租户SaaS平台核心技术指南
K8s多租户特性未来展望​:HNC会成为多租户的标准吗?
Hierarchical Namespace Controller (HNC) 将会带来一种更好的k8s多租户模型。这篇文章将要探索这个项目的当前状态以及一些有用的落地场景。
灵雀云
2020/11/03
2.1K1
K8s多租户特性未来展望​:HNC会成为多租户的标准吗?
ofbiz实体引擎(九) 多租户
多租户在平台中是根据delegator不同操作不同的数据库 /** * @author 郑小康 * 设置完整的delegator 其可能形式有 default 或者defalut#tenantDelegatorName * 针对于第一种情况 delegatorBaseName =="default" delegatorTenantId=null * 针对第二种情况 delegatorBaseName =="default" delegatorTenantId=
cfs
2018/03/08
1.1K0
Linux如何管理文档多租户
同一群组microsoft下的两个账号justmine001和justmine002需要共同拥有目录/microsoft/eshop的开发权,以便进行协同工作,但是其他人不允许进入和查阅该目录。
justmine
2019/02/15
1.7K0
xwiki管理指南-配置多租户
设置多租户(又名“virtual mode”,“multi-wiki”或“farm mode”),可以允许在相同的XWiki实例上运行多个wiki(即在同一个JVM)。
lovelife110
2021/01/14
8460
Salesforce的多租户数据模型
Salesforce的成功无法离开其底层平台Salesforce Platform的支持。而Salesforce Platform的核心是元数据驱动的多租户数据模型。
段立功
2022/06/13
2.6K0
Salesforce的多租户数据模型

相似问题

多租户ASP.NET核心

12

多租户ASP.NET核心

10

Asp.Net核心多租户

11

多租户.Net核心Web

11

ASP.NET核心多租户站点-会话到期后如何保留租户id?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文