漫谈企业级SaaS的多租户设计


企业级SaaS商场近几年在每个细分范畴都出现出了一批玩家。从技能角度看,不同的范畴、不同的SaaS产品,必定有着相同的架构内核,其中最要害的便是关于多租户(Multi-Tenancy)的支撑。对广阔企业来说,引i & 6 m 6 ` M进SaaS产品实质上便是e 9 8 t对互联网服务的租借,因而多租户便必然是SaaS的天然特色之一,也是其与传统互联网运用架构规) F b F q & :划的重要差异之一。在SaaS架构的成熟度演进进程中,其核心路线便是怎么完成多租户,也便是说,SaaS成熟度的凹凸,很大程度上取决于怎么完成多租户的支撑。

一 多租户技能的核心重视点

多租户在技能完成层面现在并没有既定的标准,不仅细节多,每处细节的完成办法也多种多样。怎么落地_ w o W m @ i ! /,一方面取决于当时研制团队现有的技能储备、技能选型、团队本钱实力、所处行业或客户特色(比方金融行业对数据安全会有更高要求),另一方面也与当时的技能发展休戚相关,云厂商的崛起和云原生年代A A 2 5 = 的到来,也深刻影响着包括U 5 A L & eSaaS在内的软件构建的办法。
漫谈企业级SaaS的多租户设计
但常规来说,真实的SaaS运用往往需求满意以下两点:
  • 单实例
  • 多租户
单实例意味着体系资源层面的同享,多租户意味着运用逻辑层面的阻隔。所以怎么平E a Y ) T U Q #衡好这两点,才是SaaS运用多租户规划的核心重视点。
经典的分布式服务架构天然X & , $ 3 S A处理了互联网运用的三高问题(高并发、高性能、高可用),这也是企业SaaS发展中后期即将面对的问题,下面咱们来剖析下如安在该架构下去规划与完成多租户SaaS运用。

二 多租户的完成

从资源同享的层面看,从share nothing到share everything,在天平的任何一个点上都能够支撑多租户。但正如咱们前文所说,SaaS架构首要考虑的目标便是单实例,只有单实例才干将本钱尽或许降低,产品才会有规划效应。所以所谓同享和阻隔,在经典架构r V U n j % :下又会聚焦G a s m _ + O i =为一点,即怎4 ~ v [ s k W )么对不同租户进行资源, a 0 U L v w层面的阻隔。

三 关7 X 1 c 8 [ |于资源

谈到资源,咱们或许会想到CPU、内存、磁盘、网络带宽等,但如此多类型的资源,从其特征上又能够归为两类,即存储资源和核算资源Y [ b u Q
换句话说,SaaS体系在技能实质上也能够以为便是分布式存储S q 1和分布式核算的融合。
在多租户的完成中,往往更要害的是关于存储资源的处理,核算资源一般只在必要情况下才会考虑,我以为这首要是和存储的“有状况性”有关。下面咱们以一些典型场景为例,具体剖析一下多租户的规划该怎么着手。

四 存储资源的阻隔

阻隔存储资源归纳来说能够用一个词来处理:命名空间。以数据库为例,咱们只需L , n 1 G I = T求在每条租户的记载上,记下对P 6 Y G ? Q H应租户的标识即可。
一般来说,不考虑分库分表的情况下,咱们逻辑上会在同一个Schema中,存储一切租户的数据。这就要求每张表都会有一个tenant_id字段,也即每条记载都带着了它的“命名空间”——+ H h I & b d h租户标识。
漫谈企业级SaaS的多租户设计
再以常用的NoSQL方案Redis为例,一般来说也是在同一个分布式集群中存储一切租户数据,那么很明显在key上带着租户标识即可。
所以不1 n = i 0 R b管何种存储,思路都是相通的,并且处理起来相对简略粗暴。但这里我想着重着重的是,在工程层面咱们应当将这种约定在底层结构里做一致处理。
比方在租户上下文中的一切SQL语句,应当都要带着where tenant_id=?M W I P P g F 6 ~这个条件,: K ; d w / ^才干确保逻辑J , , 9正确,咱们很难幻想在代码S K : 2 v从零到十万、百万行的进程中,一切人都自始] G Q W至终都紧记这个规矩。
那么相似场景下,咱们就能够经过AOP技能将多租户相关的| b c逻辑切出来进行一致处理,比方在Java中V q h b – z P,咱们能够界说@Tena= A U ] M %nt~ N :ContextAware注解,以声明而非编码的办法= J W y / } S F在需求的当地做对应的租户信息获取及传递处理。
那么又怎么确保开发者也紧记这个规矩呢,由于C @ l 5 e 6 O多租户是SaaS的天然特色,咱们能够反其道而行之,默许支撑多租户逻辑,一起界说@TenantContextUnaware注解,在不需求多租户的当地进行例外声明,这就大大降低了开发团队的负担。
同理,相似Redis Key的维护,也主张界说一致的KeyGeneratePolicy来维护。

五 核算资源B [ S n n M H的阻隔

阻隔核算资源的办法也能够用一个词来归纳,那便是亲和性,简略来说便是租户与集群核算 t V r $资源的亲和性规划。
漫谈企业级SaaS的多租户设计
核算与存储除了“状况”方面的差异外,还有一个非常重要的区别,核算的财务本钱往往远高于存储,比方咱们一台虚拟主机上或许只允许数百个线程一起处理恳求。
正因为如此,名贵的核算资源在非必要T r r ~ Z k d的情况下一般不会再进行细粒度的阻隔,例如咱们一般不会在运行时只允许某租户的恳求只提交给指7 } y / y定工作线程处理。
别的一方面,核算资源发生歪斜的后果,往往比Y p n X 3 0 * I *存储要严峻的多,好像木桶效应般,直接且显, – a ~ * j著地影响整个集群的服务才干。
但特定场景下较粗粒度的阻隔,有时候还是非常必要p * 2 E X的。比方为了S c + G A h ` e减少体系故障时租户的影响规模,咱们或许会将租户的恳求哈希后提交给不同的线程池处理,因为这种情况下,反压将会产U s # r Z ` ? 0生全局的影响。
别的咱们也或许在特定场景下进行进程、集群层面的阻隔。总的来说,对核算资源进行阻隔,没有既定的模式与套路,并且往往需求高明的资源操作水平,一般不到万不得已不主张实施。
相同地,如果一定要实施,那么也应当以组件化的办法进行,确保事务逻辑2 o c & o F的朴实性。
经过上述对存储和核算资源的阻隔处理,咱们的SaaS架构全体看起来将会是下图这个结构。
漫谈企业级SaaS的多租户设计
在这里用一个表格就一些关键对两种手法做个简略的比照,便于咱们更直观地了解。
漫谈企业级SaaS的多租户设计

六 单实例架构的扩展

面向企业的SaaS服务往往还有一些特色或许会引出一些高阶需求,而独立的单实例架构有时候并不7 s .能彻底满意这些高阶需求。此时就需B * U求对原有架构进行扩展,以实例等级的全体阻隔,合作租户级的恳求分流手法,为SaaS带来资源、软件版别等多方面的阻隔。
但需! } % 3 s O ) % k求留意的是,对单实例架构的扩展,并没有降低其架构成熟度,与咱们E x p文中一直在着重的单实例架构理念并不抵触。
比方咱们往往会根据企业客户的规划和特色对其保证等级进行分级,那怎么进一步合理地阻隔资源,保证不同等级客户的运用体会,也是一个无法逃避的问题。
这种情况下,咱们就能够考虑将这类客户的某些资源实施特殊的维护性阻隔,或者干脆将单实例架构扩展成为多实例架构,将客户分流到不I } , 4 9 T ! z Q_ 6 s s | j d保证等级的资源池。
如果有单个客户体量远超其他客户,那么在本钱允许的情况下,咱们甚至能够考虑为其建造专属资源池,对其进行重点保证,这种等级的维护并不意味着献身了小体量客户的体会,相反,往往大体量客户才更容易发生一些影响稳定性的突发事件,所以能够以为是一种多赢的操作。
别的,SaaS往往能给客户带来更快的特性交付,但这种快速交付很或许带来不佳0 ( d p y r v y b的运用体会,比方严峻BUG的存在。
那么这个时候,如果咱们的体系是多实例架构,那么就能够很轻易地完成灰度发布,从而使得特性交付的进程愈加稳健,也是对品牌形象的一种维护。

七 总结

在实践开发P N M中,咱们往往容易忽视前期对相似多租户等根底层面的体系性规划与规划,导致后期研制、维护本钱继续增加,甚至在面对一些新的= n 8 1 l 1商业机会5 + D B的时候,无法灵活应对。
好的架构则能将这些实质的特征S l u O w透明化,做到事务层无感,从而进步研制效率。在企业SaaS的多租户架构规划环节,咱们无法罗列或预判一切或许,在不同的技能选型下的多租户完成也有很大差异,咱们应当着重去发掘其技能实质,从核算与存| k B /储资源的阻隔层面,体系地规划与架构,做好根底组件的建造与沉积。
只有抛开现象去归纳总结相关实质办法,才干以不变应万变。

关于作者

张晋。网易智慧企业架构师,负责d q . O 2 O s旗下多款SaaS产品的架构、根底设施建造4 u q * ! @等相关工作,有丰富的C端、B端产品研制经历。现在首要重视企业级产品的技能架构、研制办理等方面。
更多技能干货,欢迎重视“网易智慧企业技能+”。听网易9 f V x | 4 i WCTO讲述前沿调查,看最有价值技能干货,学网易最新实践经历。网易智慧企业技能+,陪你从考虑者成长为技能专家。

发表评论

提供最优质的资源集合

立即查看 了解详情