多租户架构设计需要考虑解决的几个问题

2,409 阅读1分钟

分布式多租户架构的思考

现在市场上开发软件SAAS化已经是标配了,结合当前或者的分布式微服务和SAAS化多租户结构的实际现状和需求,我们作为技术架构如何考虑设计一套分布式微服务下多租户动态数据源切换的灵活架构方案,是当前比较紧要的一件事情。以下对于多租户动态数据源做了如下分析。

场景分析

场景一: 前端直接发起一个请求通过网关到后端服务,如果只有一个服务的情况下,需要处理被访问服务当前执行所需的数据源应该是当前登录用户所在租户的数据源
序列图如下:

sequenceDiagram
    前端->>网关:识别租户,路由到具体业务微服务
    网关->>微服务1:提供业务处理
    微服务1->>微服务1:根据租户动态切换数据源,处理业务
    Note right of 微服务1: 需要识别租户并切换数据源
    微服务1->>租户数据库:数据存储/查询
    微服务1--x网关:返回业务结果
    网关--x前端:响应前端

场景二:
多个服务协作完成某一业务的情况,直接上图

sequenceDiagram
    前端->>网关:识别租户,路由到具体业务微服务
    网关->>微服务1:提供业务处理
    微服务1->>微服务2:服务依赖
    微服务2->>微服务2:处理业务
    Note right of 微服务1: 需要识别租户并切换数据源
    微服务2->>租户数据库:数据存储/查询
    微服务2--x微服务1:返回业务结果
    微服务1->>微服务1:处理业务
    Note right of 微服务2: 需要识别租户并切换数据源
    微服务1->>租户数据库:数据存储/查询
    微服务1--x网关:返回业务结果
    网关--x前端:响应前端

场景三:
多个服务协作完成某一业务的情况,并且部分业务函异步处理,如图

sequenceDiagram
    前端->>网关:识别租户,路由到具体业务微服务
    网关->>微服务1:提供业务处理
    微服务1->>微服务2:服务依赖
    微服务2->>微服务2:处理业务
    Note right of 微服务2: 需要识别租户并切换数据源
    微服务2->>租户数据库:数据存储/查询
    微服务2--x微服务1:返回业务结果
    微服务1-->>MQ:存入消息队列
    MQ-->>任务服务:订阅消息
    任务服务->>任务服务:逻辑处理
    Note right of MQ: 需要识别租户并切换数据源
    任务服务->>租户数据库:数据存储/查询
    微服务1->>微服务1:处理自身业务
    Note right of 微服务1: 需要识别租户并切换数据源
    微服务1->>租户数据库:数据存储/查询
    微服务1--x网关:返回业务结果
    网关--x前端:响应前端

场景四
多租户场景下分布式定时任务的处理场景

sequenceDiagram
    分布式任务调度服务->>MQ:接收分布式任务
    MQ-->>任务执行服务:订阅分布式任务消息
    任务执行服务->>任务执行服务:执行任务逻辑
    loop 需要外部协同
        任务执行服务->>协同服务:执行任务逻辑
        协同服务->>协同服务:获取业务所属租户
        协同服务->>协同服务:动态切换数据源
        协同服务->>租户数据库:数据存储/查询
        协同服务--x任务执行服务:获取执行结果
    end
    
    任务执行服务->>任务执行服务:获取业务所属租户
    任务执行服务->>任务执行服务:动态切换数据源
    任务执行服务->>租户数据库:数据存储/查询
    任务执行服务-->>任务执行服务:执行完成

参考博文
将您的 web 应用程序转化为多租户 SaaS 解决方案 www.ibm.com/developerwo…
基于spring通过多数据源实现多租户应用 www.jianshu.com/p/54f35fa2f…
基于Hibernate动态数据源切换:blog.csdn.net/sysushui/ar…
实例:blog.csdn.net/lulitianyu/…