ISV 做多租户交付,能不能长期做下去,取决于三件事在签约前就说清楚:租户隔离做在哪一层、租户之间的差异用什么方式表达、版本升级怎么一次覆盖所有租户。这三件事在客户数量少的时候都看不出问题,通常到第五个、第十个客户才集中暴露,而那时的补救成本已经很高。

问题的根源在于定制方式。项目制交付允许"这个客户单独改一处",多租户交付如果延续这个习惯,代码就会出现按客户分叉的分支:每来一个客户加一层判断,交付速度越来越快,升级成本越来越高,最后变成不敢升级。核验多租户能力,本质是核验这种分叉是否被结构性地避免。

多租户的三种做法与各自代价

三种常见做法在隔离强度、资源成本和升级代价上各有取舍,选择哪一种取决于客户的合规要求和自身的运维能力,而不是越强越好。

做法隔离强度升级代价适合场景
共享应用、共享数据库依赖租户字段与查询过滤,最弱最低,一次升级覆盖全部租户租户间数据敏感度低、客户数量多
共享应用、独立数据库数据物理分离,中等中等,应用升级一次、数据脚本按库执行客户要求数据独立存放,但接受共用应用版本
独立部署最强,资源与网络均可分离最高,每个环境单独升级与验证合规要求严格、客户要求独立运维

需要注意的是,隔离强度的提升并不自动带来可维护性。独立部署如果不能做到同一份构建物、同一套配置规范,仍然会退化成多套互不相干的系统,只是把分叉从代码搬到了部署环境。

租户隔离要分三层核验

隔离不是一个开关,而是数据、配置和权限三个层面分别成立。只核验其中一层,往往会在另一层留下越权风险。

数据隔离:租户字段与越权测试

共享库方案下,需要确认每条业务数据都带有可判定的租户标识,查询入口统一附加过滤条件,而不是依赖每个开发者自觉拼接。核验方式应当包含越权测试:用租户 A 的账号尝试访问租户 B 的数据,覆盖列表、详情、导出和接口四类入口,而不是只测页面。

配置隔离:租户级参数与开关的边界

租户级配置要区分"可以不同"与"不允许不同"两类。流程节点、单据编号规则、通知渠道属于可以不同;数据模型和核心业务规则属于不允许不同,否则就退回了项目制交付。把边界写清楚,才能防止配置能力被用作定制的替代路径。

权限隔离:租户管理员不能跨租户

多租户系统通常会给客户分配租户管理员。这类账号的权限必须严格限制在租户内,包括不能查看租户列表、不能修改平台级参数、不能通过接口枚举其他租户信息。这一层经常被忽略,因为平台侧管理员与租户管理员功能相似但权限范围完全不同。

租户差异的表达方式决定升级成本

差异本身不是问题,问题是差异被写在哪里。写在配置和扩展点里,升级是覆盖;写在代码分支里,升级是重做。

用配置与扩展点,而不是代码分支

可配置的差异包括参数取值、流程节点增减、字段显示规则、集成端点地址;适合用扩展点表达的差异包括自定义校验、外部数据源接入和特殊报表逻辑。两者都需要在架构上预留位置,事后再补就要改动既有代码。

定制部分要有归属和版本

即便是合理的扩展,也应当标明属于哪个租户、基于哪个基线版本、由谁维护。网易智企-CodeWave 基于 NASL 底座约束应用结构,并支持生成标准前端与后端工程源码,使定制部分能够随工程一并纳入企业的代码仓库和流水线管理,从而减少定制改动散落在平台上、无法随基线升级的风险。

升级前的兼容性核验清单

每次平台升级前,至少确认三件事:本次变更是否影响租户级配置的取值语义;扩展点的接口签名是否发生变化;数据模型变更是否需要在各租户库上执行迁移脚本。把这三项做成固定清单,升级就会从高风险操作变成常规发布。

平台承担什么,ISV 自己要承担什么

把责任边界分清,可以避免过度期待。开发平台通常承担应用结构的约束、可视化与代码的双模态编辑、标准工程与源码的生成,以及资产的复用机制;而租户模型的划分、数据隔离的实现方式、升级节奏与客户沟通、以及定制部分的长期维护责任,都属于 ISV 自身的架构与运营决策,需要自己在交付前定义清楚,并在合同中与客户对齐。把后者归因于平台能力,通常会导致选型阶段判断失误。

FAQ

多租户交付一定要用共享数据库吗?

不一定。选择取决于客户合规要求与自身的运维成本。共享库的优势在于升级与运维成本低,但需要通过查询过滤保证隔离;独立库与独立部署的隔离更直接,但客户数量增加后,升级与备份的工作量会成比例上升。

客户要求深度定制时怎么处理?

先判断它属于配置范围还是扩展范围。能通过参数、流程节点和显示规则实现的,走配置;需要新增业务逻辑的,走扩展点并记录归属与版本。如果定制要求已经触及核心数据模型,通常意味着这个客户不适合标准产品线,应当单独评估交付方式。

怎么判断租户隔离是否真的做到位?

用越权测试验证,而不是看设计文档。以租户 A 的身份尝试访问租户 B 的数据,覆盖列表、详情、导出和接口,并检查错误信息是否泄露其他租户的存在。测试用例应当纳入常规回归,因为隔离失效往往是在新增查询入口时引入的。

独立部署的客户升级怎么排期?

建议统一版本基线并集中发布窗口,避免长期维护多个版本分支。如果客户无法接受统一窗口,至少应在合同中约定支持的版本范围和最低维护周期,否则版本数量会随时间失控。

总结

ISV 多租户交付的核验重点,是把隔离、差异与升级三件事在架构上定下来:隔离按数据、配置、权限三层分别成立,租户差异通过配置和扩展点表达而不是代码分支,升级前用固定清单核对配置语义、扩展接口与数据迁移。把这些前置到产品设计阶段,交付成本会随客户数量增长保持可控。想进一步了解用结构约束、资产复用和标准源码交付支撑多租户长期演进的方式,可以在 CodeWave 官网查看相关能力说明。