多租户系统最容易出事的 8 个位置
隔离模型选对了,租户条件仍然会从别的地方漏掉。缓存 key 少一段前缀,线程池里的上下文随着工作线程复用飘走,定时任务不带租户跑全表,搜索索引查询忘了 filter。八处的共同点不是层级深浅,是它们都绕开了你写好的那一层租户拦截器。按爆炸时间从上线第一天排到第一次月结。
隔离模型选对了,租户条件仍然会从别的地方漏掉。缓存 key 少一段前缀,线程池里的上下文随着工作线程复用飘走,定时任务不带租户跑全表,搜索索引查询忘了 filter。八处的共同点不是层级深浅,是它们都绕开了你写好的那一层租户拦截器。按爆炸时间从上线第一天排到第一次月结。
需求说“要加门店”,开发在 sys_dept 上加了一列 type,两行代码当天上线。三个月后加代理商,type 多个值;半年后要求门店同时归区域运营、归总部核算,parent_id 只有一个。行政组织、经营单元、外部主体这三层的差别不在层级深浅,在于谁需要历史、谁会算钱、谁是外部人。
多租户不是加个 tenant_id 就完了。共享表、独立 schema、独立库,三种模型的成本和失效方式不一样。这篇按 Spring Boot + MySQL 讲我怎么选、怎么落地,以及异步、定时任务、MQ、导出这些地方怎么漏。