构建SaaS云平台多租户架构,首要的问题要解决数据如何存储的问题,业界基本上已经形成共识,无非是以下三种方案:

1、共享数据库,共享表

多租户SaaS 代码库 密钥 git代码库 java saas多租户平台_多租户


在表中增加TenantId多租户的数据字段,以区分不同租户的数据。这种做法最大的好处是成本低,租户增加不会增加资源成本。

最明显的缺点是满足不了用户更高的数据隔离安全要求。

2、共享数据库,隔离表

在同一个数据库实例中,为不同的租户创建独立的表。这种架构,没什么好处,完全没有必要采用。

3、独立数据库

多租户SaaS 代码库 密钥 git代码库 java saas多租户平台_多租户_02


每个租户独立一个数据库实例,最大的好处就是数据隔离安全性高,最大的缺点就是资源成本高,维护成本高。

4、共享/独立混合结构

多租户SaaS 代码库 密钥 git代码库 java saas多租户平台_多租户_03


而真正实用的SaaS云平台多租户数据库隔离方案,应该同时兼顾方案1和3的优点,即支持共享库表模式的多租户方案,又支持独立数据库模式的多租户方案。

有这样架构支持,运维上可以充分节省资源,运营上可以充分利用系统的特性,制定不同的服务能力与价格策略。用共享模式服务看重成本的租户,用独立数据库的模式服务数据隔离安全要求高的租户。

实现共享独立混合结构,技术上的重点在于租户TenantId的拦截识别,基于租户的动态数据源的创建、切换、管理,以及SQL层面增加TenantId字段的改写。

多租户SaaS 代码库 密钥 git代码库 java saas多租户平台_数据库_04


上述的方案是SaaS云平台多租户数据存储方案的基础,在实际研发中还需要考虑更多的细节,如租户数据由共享到独立的数据迁移,数据源的监控,服务实例资源监控等等,如何能够快速应对生成环境中突如其来的的压力,即时发现问题调配资源,保障SaaS云平台对最终用户的高可用等等。