关于SaaS多租户系统设计的思考

场景

软件的多租户设计,也是SaaS设计,软件的用户可以以租户为单位使用系统。

举个栗子,比如一个律师事务所系统,事务所1和事务所2共同使用这一个系统。

  • 两个事务所的数据是完全隔离,互不影响。
  • 甚至两家事务所访问系统域名地址也不同,比如 http://law1,http://law2
  • 可能两个系统内功能也有所不同,事务所2多掏了钱用的是高级版,事务所1用的普通版
  • 一个事务所系统下可以创建用户、角色等等,与另一个事务所系统无关
  • 租户和用户的关系,可能是一对多,也可能是多对多,一对多就是先选择用户再创建租户,多对多说明用户可能在多个租户下,涉及到切换租户的问题

这样的系统有很多,比如钉钉,钉钉里一个单位就是一个租户,当然钉钉用户可以在多个租户下,可以切换租户

哪些数据该隔离

首先租户数据隔离,要明确哪些该隔离。

  • 数据库数据肯定要隔离,持久化的数据。
  • 缓存也应该隔离,否则不同的两个系统用同一份代码,租户可能会获取到其他租户的缓存。
  • 中间件,消息队列
  • 文件存储,文件的获取地址url如果是由数据库表得到,那共用一个文件存储也没关系

凡是中间件,都应该想想是否要隔离。

哪种场景要隔离

凡是调用程序的方式,都应该考虑是否应该隔离。

  • http调用
  • 服务间调用,如feign、rpc
  • 定时任务
  • 消息队列订阅发布

隔离设计思路

面对不同的应用场景,应该有不同的隔离思路,没有最好的方案,适合需求即可

数据表隔离

在表设计增加租户id字段,即所有租户用的表相同,数据也都存储在一起,这样所有跟租户数据有关的查询sql都要加 tenant_id=xxx.

这种方式适合租户较少的情况,比如开发教学系统,一个学校会有几个校区,每个校区有自己的数据,一个公司有几个子公司,每个子公司直接数据隔离。

因为学校校区不会有很多,子公司也不多,就比较适合,共用一个数据库也够用。如果采用其他方式反倒浪费资源。

数据库隔离

每个租户用单独的数据库,即数据源不同,但租户用的前后端应用程序是一个。

这种方式适合每个租户的软件需求大部分一致,这样可以共用一份前后端代码,如果有些许的需求不同,可以利用租户页面菜单进行控制,通过租户菜单数据,让租户页面显示不同。

数据源不同涉及到数据源的切换问题,主要靠后端程序进行。基本思路是请求中携带租户标志,可以是域名不同、请求头添加租户标志等等,后端拦截器中设置切换数据源。如果是分布式系统,则每个分布式系统都得有切换数据源的功能。

应用隔离

租户使用的应用直接不同,租户1使用应用1,租户2使用应用2,两个应用部署的服务器不同。

这样适合租户软件需求不一致,特殊化定制需求,或者某个租户有钱,专门为自己开设单独应用、服务器,保证性能。

这样相当于为租户单独部署一套系统,需要在网关针对租户域名或其他标识 ,路由到租户应用。

实际工作中,可以将数据库隔离和应用隔离结合起来,付费特殊化定制的租户就用应用隔离,普通租户就用数据库隔离、使用同一个应用,两个方案结合使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值