ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Flowable 多租户架构:SaaS 场景下的租户隔离完整方案

Flowable 多租户架构:SaaS 场景下的租户隔离完整方案 Flowable 多租户架构SaaS 场景下的租户隔离完整方案【免费下载链接】flowable-userguideFlowable最新中文文档,ai自动生成BPM体验地址http://flow.je4.cn/#/login项目地址: https://gitcode.com/gh_mirrors/fl/flowable-userguideSaaS 场景下Flowable 多租户架构是让一套流程引擎服务多个企业客户的关键能力。作为目前主流的开源工作流引擎Flowable 通过租户标识符Tenant ID机制实现了灵活的数据隔离。本文将从零开始为你拆解Flowable 租户隔离方案的核心原理、部署方式、查询过滤与数据库设计帮助你快速搭建安全可靠的 SaaS 多租户流程平台。即使你刚接触工作流引擎也能轻松看懂这份 Flowable 多租户实战指南。什么是多租户为什么 SaaS 需要它多租户Multi-tenancy是指一个软件同时为多个不同组织提供服务。它的核心目标是数据隔离组织 A 绝对不能看到组织 B 的任何流程数据。在 Flowable 的语境中每个被服务的组织也可以是部门、团队、项目组被称为一个租户Tenant。想象一下你运营一个 SaaS 平台100 家公司在上面跑各自的审批流程。如果所有公司的流程数据混在一起后果不堪设想。而 Flowable 多租户机制正是为解决这个问题而设计的。Flowable 多租户 vs 多实例部署先分清这两个概念 在深入之前请务必区分两个容易混淆的概念多租户部署所有租户共享同一个 Flowable 引擎实例、同一套数据库表通过租户标识符区分数据。多实例部署每个组织各自运行独立的 Flowable 引擎实例使用独立的数据库账户。Flowable 引擎本身很轻量运行一个实例不会耗费太多资源但多实例部署仍然会增加运维复杂度和维护成本。对于绝大多数 SaaS 场景在同一个引擎内做多租户隔离是更经济、更主流的方案。需要特别说明的是Flowable 并不强制多租户规则。也就是说引擎在查询数据时不会自动验证当前用户是否属于正确的租户——这一层校验需要你在调用引擎的上层业务代码中实现。Flowable 负责的是可靠地存储租户信息并支持按租户获取流程数据。租户标识符隔离一切的魔法钥匙 在 Flowable 中实现租户隔离的关键就是租户标识符Tenant ID。它本质上是一个字符串可以是 UUID、部门 ID 等任意标识最长 256 个字符。在部署流程定义时传入租户 ID整个数据链条就会自动带上租户血脉部署中包含的所有流程定义继承该租户 ID从这些流程定义启动的流程实例继承租户 ID流程实例创建的任务、执行对象继承租户 ID触发的信号事件只在对应租户上下文内生效同名信号只触发正确租户的捕获事件所有作业定时器、异步操作继承租户 ID方便自定义作业执行器按租户分配优先级所有历史数据历史流程实例、任务、活动同样继承租户 ID模型Modeler 中存储的 BPMN 2.0 模型也可以设置租户 ID。这个继承链设计非常巧妙你只需要在部署时指定一次租户后续产生的所有数据都会自动归属到正确租户无需重复设置。如何在 Flowable 中部署带租户的流程在 Java 环境中只需在创建部署时调用tenantId()方法即可repositoryService.createDeployment() .addClassPathResource(my-process.bpmn20.xml) .tenantId(myTenantId) .deploy();一次指定处处生效。如果通过 Flowable REST API 部署只需在请求体中附带tenantId字段表单参数例如值为myTenant即可完成带租户的部署。部署完成后你可以在 Flowable Admin 的部署管理页面看到每条部署对应的租户信息并支持按租户名称或标识进行筛选操作非常直观。按租户查询流程数据查询 API 的正确姿势 所有 Flowable 查询 API 都支持通过租户标识符过滤。例如查询指定租户下的流程实例runtimeService.createProcessInstanceQuery() .processInstanceTenantId(myTenantId) .processDefinitionKey(myProcessDefinitionKey) .variableValueEquals(myVar, someValue) .list();查询 API 还支持模糊匹配使用tenantIdLike语义通过租户 ID 的like条件过滤无租户过滤使用withoutTenantId查询不带租户标识符的实体REST 风格REST API 中的部署、模型、流程实例、任务等查询均支持tenantId、tenantIdLike、withoutTenantId三个过滤参数还支持按tenantId排序。数据库层面如何实现租户隔离️Flowable 的建表脚本中几乎所有核心表都预留了租户字段。以 MySQL 引擎表为例ACT_RE_DEPLOYMENT部署表、ACT_RE_PROCDEF流程定义表、ACT_RU_EXECUTION运行实例表、ACT_HI_PROCINST历史实例表等均包含TENANT_ID_ varchar(255) default 字段。关键的数据库设计细节是默认的无租户标识是空字符串而不是null。这是因为流程定义 key、版本、租户 ID的组合需要满足唯一约束。如果租户 ID 为null某些数据库如 Oracle会将空字符串视为null从而破坏唯一性判断。因此多个租户可以部署相同 key 的流程定义每个租户拥有各自的版本序列不传租户 ID 时所有数据自动归入空字符串租户完全兼容非多租户的旧用法。另外Flowable 也支持集群部署多个引擎实例这与多租户机制并不冲突。三种主流租户隔离方案如何选择结合 Flowable 的特性SaaS 项目通常有三种隔离方案方案隔离强度成本适用场景共享库共享表租户 ID 字段逻辑隔离最低中小型 SaaS租户数据量大但敏感度一般共享库独立表按租户分表/分库中等中等需要更强隔离可接受更高运维成本独立库独立引擎多实例部署物理隔离最高金融、医疗等强合规场景或少数大客户定制Flowable 内置的租户 ID 机制属于第一种方案也是绝大多数 SaaS 产品的首选零额外基础设施、部署简单、查询灵活配合上层权限校验即可满足日常需求。从单租户迁移到多租户租户迁移技巧 如果你的项目早期没有使用多租户现在想升级怎么办Flowable 提供了一个实验性 APIrepositoryService.changeDeploymentTenantId(deploymentId, newTenantId);调用该方法可以修改部署的租户标识符并自动连带更新所有此前继承的租户标识符流程定义、流程实例、任务、历史数据等。这在你从非多租户环境迁移至多租户部署时非常有用详细行为可参考该方法的 Javadoc 说明。总结一套方案搞定 SaaS 租户隔离 ✅回顾全文Flowable 多租户架构的核心要点可以浓缩为四句话一个租户 ID贯穿全链路部署时指定一次定义、实例、任务、作业、历史全部自动继承引擎不强制、上层要自守租户归属校验要在业务层实现Flowable 只负责存取和查询查询 API 全面支持租户过滤Java API 与 REST API 都提供了完整的三件套精确、模糊、无租户数据库层面预留字段TENANT_ID_字段配合空字符串默认值兼顾隔离与兼容。如果你想深入源码细节可以参考本仓库中的官方中文文档多租户完整章节含代码示例REST API 租户参数说明MySQL 引擎建表脚本TENANT_ID_ 字段定义掌握这套 Flowable 租户隔离方案你就能用一套引擎优雅地服务千家客户让 SaaS 业务流程安全、高效地跑起来。祝你的多租户之旅一帆风顺【免费下载链接】flowable-userguideFlowable最新中文文档,ai自动生成BPM体验地址http://flow.je4.cn/#/login项目地址: https://gitcode.com/gh_mirrors/fl/flowable-userguide创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进