点击空白处退出提示
作品详情
这是一系列的组件。
1、多租户的支持需要解决【租户隔离】和【链路跟踪】两大问题。
1.1、租户隔离,包括数据隔离和服务隔离
1.1.1、数据隔离
每个租户都拥有自己客户、订单等数据。因此SaaS化的平台需要隔离不同租户的数据,即租户只感知到自己的数据,不应该感知到别的租户的存在。
到技术这一层面,就是租户的MQ消息、DB数据、Redis数据如何隔离的问题。
我们SaaS数据隔都是逻辑隔离,可以更高效地复用硬件资源
1.1.2、服务隔离
即每个租户感觉自己是独享整个服务,而不应该感觉到其它租户的存在。
我们SaaS平台提供的服务隔离的是逻辑的隔离,可以更高效地复用硬件资源
1.2、链路跟踪
即在给定的【租户隔离】的方案下,要能随时随地的获取租户id(也包括租户的其它信息),就必需保证租户id信息能随【调用链】一直传递下去。
但是,未使用多租户组件的情况下,租户id等信息必定会在【调用链】传递过程中的某些“环节”丢失。
导致租户id丢失“环节”的罗列如下:
1.2.1、分布式服务间调用导至 租户id 丢失。
例如:在一个【调用链】中,上游服务调用下游服务接口,如果上游服务未在 租户id 放入请求中,或者下游服务接收到请求但未从中提取租户id并放入本服务的“上下文”中,都会导致租户id未能正确传递而丢失。
1.2.2、服务内异步线程调用的环节
由于链路信息在同一jvm进程内部是以线程变量(ThreadLocal)作为载体传递的,所以产生线程切换的异步调用会导致链路信息丢失。
对此,可以使用InheritableThreadLocal,InheritableThreadLocal在父子线程中传递。此解决方法对开发人员完全透明
1.2.3、线程池里环境下因为线程重复利用导致租户id被覆盖而丢失。
开发人员可以用SaasThreadPoolExecutor线程池。
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
评论