SaaS软件系统多租户设计方案

/ 2评 / 26

多租户Multi-Tenant架构设计方案的关键,就是通过一定的策略来保证不同租户间的数据隔离,确保不同租户既能共享同一个应用实例,又能为了用户提供独立的应用体验和数据空间。

尤其要避免出现A租户查询到B租户的数据,这个是SaaS软件系统一大忌讳,直接导致租户对软件系统信任度止跌到最低。这个在市面上有很多产品都出现过,尤其重要。

既然要保证不同租户间的数据隔离,其实就在说数据库如何存取数据。 我们在思考数据库隔离机制的主要对比了三种方案:

方案一:每个租户独立一个数据库

在应用服务配置不同数据库,一个新租户就开启一个数据库,复制原来的数据库表结构。 优点:不同租户的数据可实现物理分离,安全性较好。 缺点:数据库利用率不高,单租户的数据量通常不高。对数据库表维护或数据库设置的运维工作也不小。

方案二:每个租户单独一个Schema

在方案一的基础进行优化,同个数据库下可有有个schema。 优缺点与方案一大致来说类似,并非是一个全新的解决方案。

方案三:共享数据库表数据

增加一个Tenant表,且在租户业务表中增加tenant_id用于区分是哪个租户的,在对租户业务表中CURD操作都需要增加上tenant_id。 这方案理解不难,但需要确保开发人员在编写过程中不会遗漏tenantId字段,如遗漏或设置错的情况则会导致租户数据混乱的问题。
再进一步而言,tenantId对于大部分开发者来说,应该是透明的,因为每个租户的订单流程都是一致(如不一致是根据配置而定),也就说在逻辑代码而言,是不需要知道tenantId的。

共享数据库表数据流程示意图

最终我们实现方案是将: tenantId保存在本地线程中,再增加Mybatis插件,对所有租户业务表统一增加where tenantId = #{tenantId}。
这样能确保在对大部分开发人员透明tenantId外又可以保证租户数据不错乱的情况。

  1. Frank说道:

    我们公司也计划开始做saas系统,在前端怎么识别是哪家公司?

    • patricklau说道:

      @Frank 在商城上有3种方案:
      1、www.自己公司域名.com/tenantId(租户代号),可无限使用无成本。
      2、自己公司二级域名,有限使用,有一定的运维成本。
      3、租户定义域名,通常是定制服务。

      内部管理系统,就用租户代号了,比较简单。

发表评论

您的电子邮箱地址不会被公开。