「产品矩阵平台」多租户与多应用设计

系统说明 Tenant、App、Namespace、配置继承、数据隔离、域名路由与 SaaS 层级设计,帮助产品矩阵从自用平台演进为可商业化 SaaS。

第五章 多租户与多应用设计

多租户设计的目标,不是简单给每张表加一个 tenant_id。真正的目标是:同一套平台能服务多个组织、多个产品、多个环境,同时保证数据隔离、配置独立、权限清晰和成本可控。

产品矩阵平台中,多租户和多应用是两个不同维度:

维度含义示例
Tenant使用平台的主体企业、品牌、客户、开发者
App租户下的具体产品小程序、Web 站、管理后台
Namespace逻辑命名空间dev、prod、活动专区

5.1 多租户隔离策略

常见隔离方式有三种:

模式优点缺点适用场景
共享库共享表成本低、运维简单隔离弱、查询必须严谨早期 SaaS、长尾租户
共享库独立表部分隔离、迁移灵活表数量膨胀中型租户、半独立业务
独立库隔离强、合规友好运维成本高大客户、金融医疗

平台可以采用混合策略:默认共享库共享表,大客户升级为独立库,审计、账单等平台公共数据仍保留在中心库。

5.2 Tenant、App 与 Namespace 模型

建议模型关系:

erDiagram
    TENANT ||--o{ APP : owns
    APP ||--o{ APP_ENV : has
    APP ||--o{ APP_CONFIG : configures
    TENANT ||--o{ MEMBERSHIP : has
    USER ||--o{ MEMBERSHIP : joins

核心字段:

关键字段
tenantsidnameplanstatus
appsidtenant_idtypenamestatus
app_envsapp_idnamespacedomainsecret
membershipstenant_iduser_idrole

AppIDAppSecret 不应直接等同于数据库主键。它们是对外凭证,应可轮换、可禁用、可审计。

5.3 租户上下文注入

租户上下文应在请求入口统一解析。

解析来源可以按优先级排列:

  1. 自定义域名,如 acme.example.com
  2. Header,如 X-App-ID
  3. JWT Claims,如 tenant_idapp_id
  4. 路径前缀,如 /t/{tenant_slug}
  5. 开放平台签名参数。

解析完成后写入 context.Context,后续 Service、Repository、日志、审计都从上下文读取。

5.4 数据表 Schema 设计

共享表模式下,业务表至少要有:

字段说明
tenant_id租户隔离
app_id应用隔离或来源
namespace环境或空间
created_by创建人
updated_by更新人
deleted_at软删除

索引不能只按业务字段建。例如内容表常见查询是“某租户某 App 下按状态分页”,索引应考虑:

CREATE INDEX idx_contents_tenant_app_status_time
ON contents (tenant_id, app_id, status, published_at);

缺少 tenant_id 前缀的索引,在多租户数据量变大后会非常昂贵。

5.5 应用注册与生命周期管理

App 不是一条配置记录,而是有生命周期的对象。

created -> configured -> verified -> active -> suspended -> archived
状态含义
created已创建但未配置凭证
configured已配置域名、回调、密钥
verified域名或平台审核通过
active可正常访问
suspended欠费、违规或管理员暂停
archived归档,不再对外服务

生命周期变化必须写审计日志,尤其是暂停、恢复、密钥轮换和删除。

5.6 App 配置分层

配置继承顺序建议为:

platform default
  -> tenant default
  -> app config
  -> namespace config
  -> runtime override

读取配置时要返回“最终值”和“来源”。运维排障时,知道某个开关为什么是 true,往往比值本身更重要。

5.7 SaaS 层级设计

平台可支持三种 SaaS 形态:

形态说明示例
单体 SaaS一个租户使用标准产品中小企业订阅 CRM
子租户 SaaS租户下继续管理客户代理商管理多个门店
白标 SaaS租户拥有品牌和域名给行业客户输出独立品牌

白标 SaaS 需要更强的主题、域名、邮件发件人、支付主体和备案支持,不能只换 Logo。

5.8 API 网关级多租户路由

网关应在转发前完成租户识别和基础校验。

路由方式例子优点
独立域名api.acme.com品牌独立、隔离清晰
子域名acme.platform.com管理方便
HeaderX-App-IDSDK 和服务调用友好
路径/tenant/acme/api开发简单

生产环境优先推荐域名或 Header,路径模式适合开发、测试和内部工具。

5.9 常见风险

风险后果防护
查询漏加 tenant_id数据串租户ORM Scope、测试、审计
后台超级权限滥用合规事故审批、双人复核、审计
配置覆盖不透明线上行为不可解释配置来源追踪
租户删除过于直接数据不可恢复冷归档、延迟删除
密钥不可轮换泄露后无法止血多密钥版本

多租户不是一个功能点,而是贯穿身份、数据、配置、日志、计费和运维的系统约束。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页