主题
Next.js 高级架构
Next.js 多租户和多区域部署如何隔离域名、缓存和数据?
高级方案必须同时回答租户从哪里识别、请求在哪里执行、缓存如何分区,以及数据主权和故障切换如何保证。
面试官想考什么
- 租户是按 path、subdomain 还是自定义域名识别? 考察路由建模。
- CDN 缓存如何避免跨租户? 考察缓存安全。
- 多区域是读就近还是数据也就近? 考察一致性与合规。
- 用户修改租户配置后多久生效? 考察失效和传播。
一句话回答
text
先把租户解析成不可伪造的请求上下文,再让路由、权限、缓存 key、数据库连接和观测字段都携带 tenantId;多区域按数据主权和一致性选择读写策略,公共缓存与个性化缓存严格分开。面试回答详解
1. 租户识别
text
host/path -> canonical tenant -> session membership
-> region policy -> route/data/cacheHost、path 或自定义域名只是线索,服务端要查询域名绑定并校验用户是否属于租户。不能信任客户端传来的 tenantId。
2. 缓存隔离
- 缓存 key 至少包含租户、资源和必要的语言/版本维度。
- 含用户权限的页面不进入公共 CDN 缓存。
- Router Cache 和 Data Cache 失效时要考虑租户范围。
- 不能用“响应里隐藏了数据”替代真正的缓存隔离。
3. 多区域策略
- 单主写入:一致性清晰,跨区写延迟较高。
- 区域读副本:访问快,但有复制延迟。
- 区域独立租户:隔离和合规好,运维复杂。
- 全局多主:可用性高,但冲突和数据模型复杂。
Next.js 只负责请求编排,不能替数据库解决跨区域一致性。
4. 配置和失效
租户主题、feature flag 和套餐配置可使用短 TTL 或 tag 失效;权限、账单和敏感数据优先实时读取。配置更新要带 revision,边缘节点收到旧版本时可以检测并重试。
5. 观测与故障
日志使用脱敏 tenant hash、region、route、cache status 和 release。故障切换时明确哪些请求可以读旧数据、哪些必须失败,避免为了可用性越权或展示错误租户内容。
可直接背诵的 30 秒回答
text
多租户的关键不是加一个 tenantId 字段,而是让租户上下文贯穿 host 解析、session、权限、缓存、数据库和日志。租户 id 由服务端从可信绑定得到,CDN 和 Next 缓存按租户严格分区。多区域根据数据主权、一致性和延迟选择单主、读副本或区域独立部署,并为配置失效和故障切换定义清晰边界。扩展知识
租户上下文最小字段
text
tenantId + userId + membershipVersion + region + policyVersion把原始 cookie、完整邮箱和敏感业务内容带入缓存或日志会扩大泄露面。
面试官追问链
追问一:租户主题可以直接用 Host 拼出来吗?
- 考察点:域名绑定安全。
- 回答方向:不能直接信任。应查询已验证域名绑定,处理大小写、端口、代理头伪造和未绑定域名。
追问二:如何验证没有跨租户缓存泄露?
- 考察点:测试能力。
- 回答方向:用两个租户和不同权限做缓存命中、预取、SSR、RSC、CDN 的 E2E,检查响应、Router Cache 和失效后内容。
追问三:跨区复制延迟时用户看到什么?
- 考察点:一致性产品化。
- 回答方向:对强一致操作回主区或显示处理中;对允许最终一致的内容显示版本/更新时间,不要静默宣称已同步。