于高衡的技术博客-分享golang、前端、职场、生活琐碎

无代码平台开发日记【多租户实现】

无代码平台开发日记【多租户实现】
2022-02-27 · 3 min read
无代码 后端 技术

开发saas应用无法回避的一个功能就是多租户系统的设计,今天来分享一下我在开发无代码平台的时候,是如何实现多租户系统的。

首先,无代码平台中有工作区的概念,一个用户可以创建工作区,也可以同时加入多个工作区,在不同的工作区扮演不同的角色,甚至拥有不同的姓名(⊙o⊙)…

对于系统设计而言,一个工作区就是一个租户,不同租户的数据应该独立存储,以便出现私有化部署需求时可以快速抽离租户数据,不影响其他租户;也是为了降低代码复杂程度,避免每个表都要以工作区id进行查询。

用户表(user)需要在外部的总数据库存储一份,同时每个工作区需要有各自的成员表(member),用户注册时,用户表新增数据,加入工作区后,才会在成员表新增数据,实现每个工作区用户的姓名、部门、角色单独管理。

在查询数据的时候,我们当然不能在每个接口都写一遍切换数据库的代码,这种工作一定是放在中间件执行的;因为设计登录接口的时候已经把工作区id存储在jwt里了,所以在jwt中间件就可以拿到当前进入的工作区id,使用gdb的SetSchema方法进行数据库的设置,这样就做到全局自动切换数据库了。

在用户创建工作区的时候,我们需要创建一个全新的数据库,并且执行数据库初始化sql脚本,进行数据表结构的创建,我的做法是转储一份正在使用的数据表结构,把sql文件存储在后端代码库,创建数据库之后,读取文件并执行文件内容的sql语句,这种方式比较方便后期迭代。

这样的设计有一个比较大的问题就是,如果需要修改表结构,需要遍历每个租户的数据库进行修改,如果租户数量特别多,就非常之麻烦了。
目前还没有想到一个完美的解决方案,只能在设计数据结构的时候尽量考虑扩展性,避免必须修改表结构的状况出现,好在这个项目使用的是postgresql,jsonb用好了还是很灵活的,不至于经常需要改表。