大多数工程师谈到 SaaS,第一反应是:多租户、分库分表、RBAC 权限体系。这些都是对的,但只是 SaaS 的表象。
SaaS 真正对工程提出的挑战,是一组结构性要求:系统必须能横向无限扩展,必须在不知道谁是下一个大客户的情况下保证所有人的体验,必须在出现故障时自动收敛,必须在全球多地运行且数据保持一致。
本系列共 8 篇研究文档 + 1 篇监控专篇。本文是总纲,也是架构师思考 SaaS 系统的起点。
一、SaaS 的核心挑战地图
在深入任何具体技术之前,先建立一张全局地图。SaaS 工程的六大命题不是独立的,它们有依赖关系:
markdown
SaaS 系统核心命题
├── ① 租户隔离与资源治理 ──── 谁能用什么、用多少
│ ↓
├── ② 弹性扩缩 ───────────── 系统能否自动适应不确定负载
│ ↓
├── ③ 稳定性与 SLO ──────── 可量化的可用性保障
│ ↓
├── ④ 数据一致性 ────────── 分布式系统中的正确性
│ ↓
├── ⑤ 多区域全球化 ──────── 跨地域的写冲突与数据主权
│
└── ⑥ 异步架构 ──────────── 解耦与过载自保护(也支撑③稳定性)
这六个命题相互依赖:弹性扩缩依赖无状态化,无状态化会引入一致性问题,一致性问题在多区域场景下变得更复杂,多区域下的高可用又依赖稳定性工程的兜底体系。拆开单独看任何一个,都会做出局部最优但全局次优的决策。
二、监控:被忽视的系统基础设施
SaaS 系统有一个不在六大命题里、但比六大命题都重要的前提:你必须知道系统正在发生什么。
监控(可观测性)不是"用完再补"的锦上添花,而是所有工程决策的信息来源:
| 信息来源 | 驱动的工程能力 |
|---|---|
| Metrics(量化系统状态) | 弹性扩缩触发(基于 QPS/Lag/CPU) |
| Metrics(量化系统状态) | 降级与熔断(基于错误率/延迟) |
| Metrics(量化系统状态) | SLO 消耗计算(基于成功率指标) |
| Metrics(量化系统状态) | 容量规划(基于历史趋势) |
| Logs(记录事件上下文) | 故障定位(结合 Trace 还原根因) |
| Traces(链路调用路径) | 故障定位(跨服务调用链分析) |
没有监控,降级决策是盲目的,SLO 是无法计算的,故障定位是靠猜的。监控是第一现场,其他所有工程能力都建立在它之上。
第 08 篇专门讨论可观测性体系的建设。
三、从"调优单点"到"设计系统":升维的本质
与很多工程师交流时,我们发现技术能力升维有一个共同的模式:
| 层次 | 典型做法 | 核心能力 |
|---|---|---|
| 初级:解决当前问题 | Redis 缓存加速 / 数据库加索引 / 限流防止超载 / 消息队列削峰 | 能解决 80% 的问题 |
| 中级:设计可扩展方案 | 缓存一致性策略 / 分库分表设计 / SLO + 降级链路 / 背压 + 幂等性 | 能设计中大规模系统 |
| 高级:定义系统边界与约束 | 状态生命周期与一致性边界 / 租户资源模型与成本边界 / Error Budget 与架构取舍节奏 / 可恢复性 SLA 与故障收敛路径 | 能做平台级架构决策 |
升维不是学更多技术,而是从"解决问题"到"定义问题边界"。
四、架构师的决策模型:如何在多个方案中选择
这是整个系列中最重要、但最难量化的能力。面对同一个问题,资深架构师和普通工程师给出的答案在选择逻辑上是不同的。
4.1 普通工程师的选择方式
arduino
问题 → 搜索方案 → 选看起来最"正确"或"高级"的 → 实施
这种方式容易导致:
- 方案和当前规模不匹配(团队只有 5 人,上了 Kubernetes + 微服务全家桶)
- 忽视隐性成本(引入 Kafka 需要运维成本,团队是否有能力承担)
- 解决了技术问题,但创造了更多技术问题
4.2 架构师的选择方式
markdown
问题 / 需求
↓
【第一步】当前规模下这个问题有多痛?
→ 还能忍,影响不大 → 记录,纳入技术债,本期不处理
→ 已经影响业务 ↓
【第二步】问题的根本原因是什么?(5 Why)
↓
【第三步】有哪些解法?各自的代价是什么?
↓
【第四步】当前团队能否驾驭最优方案?
→ 能驾驭 → 选最优方案 + 设计演进路径
→ 驾驭不了 → 选次优但可执行的方案 + 明确升级触发条件
↓
【最终】文档记录决策原因和约束
关键差异:架构师不只是选方案,还要:
- 定义问题边界:这个问题在当前规模下真的是问题吗?
- 评估全部代价:技术代价 + 组织代价 + 时间代价
- 设计演进路径:当前方案在什么条件下需要升级?
- 文档化决策理由:6 个月后新人理解为什么这样设计
4.3 降级收敛:架构师对稳定性的核心思维
降级不是"出了故障再说",而是预先设计好"当 X 发生时,系统应该处于什么状态"。
降级状态机(需要在系统设计阶段提前定义):
| 当前状态 | 触发条件 | 目标状态 | 触发方式 |
|---|---|---|---|
| 正常运行 | 非核心服务错误率 > SLO 阈值 | 局部降级 | 自动 |
| 正常运行 | 核心依赖不可用(熔断器开启) | 全面降级 | 自动 |
| 正常运行 | 存储写入不可用 | 只读模式 | 自动 |
| 局部降级 | 服务恢复(自动检测) | 正常运行 | 自动 |
| 局部降级 | 降级范围扩大 | 全面降级 | 自动 |
| 全面降级 | 核心依赖恢复(半开探测成功) | 局部降级 | 自动 |
| 只读模式 | 写入恢复 | 正常运行 | 自动 |
| 全面降级 | 兜底数据也不可用 | 服务不可用 | 触发人工介入 |
| 服务不可用 | 人工介入恢复 | 全面降级 | 人工 |
每个状态跳转都需要:明确的触发条件(指标阈值)、自动执行的动作、人工介入的判断标准。
五、SaaS 工程的三个层次与本系列导读
| 层次 | 文章 | 核心内容 |
|---|---|---|
| 基础层(先解决) | 01 租户架构 | 隔离模型 + 资源边界 |
| 基础层(先解决) | 02 弹性扩缩 | Cell 架构 + 无状态化 |
| 稳定性层(建立在基础之上) | 03 稳定性与 SLO | Error Budget + 降级收敛 |
| 稳定性层(建立在基础之上) | 06 异步架构 | 背压 + 可恢复性 |
| 分布式层(最复杂) | 04 数据一致性 | 一致性模型 + 业务对齐 |
| 分布式层(最复杂) | 05 多区域全球化 | 写冲突 + 数据主权 |
| 治理层(持续演进) | 07 平台化治理 | DDD + 技术债 + 演进节奏 |
| 治理层(持续演进) | 08 可观测性 | 监控体系 + 第一现场 |
建议阅读路径:先 08(监控,建立信息感知基础)→ 01 + 02(基础设计)→ 03(稳定性是贯穿全局的)→ 04 + 05(分布式问题)→ 06(异步解耦)→ 07(长期治理)
六、做好 SaaS 需要的三个思维转变
从"为特定用户开发"到"为不确定的用户群开发"
传统软件你知道谁是用户,知道并发量,知道数据规模。SaaS 不知道。下个月可能来一个数据量是现在 100 倍的客户,系统必须提前设计好应对这种情况,而不是等那天再手忙脚乱。
从"开发完就交付"到"持续运营是工程的一部分"
SaaS 没有"交付"节点。每次变更上线,都是对所有客户同时的变更。稳定性、监控、灰度、回滚,不是运维的事,是工程的一部分。不懂这个的工程师,迟早会因为一次"应该无害的变更"引发生产事故。
从"技术正确"到"当前阶段最合适"
强一致性在技术上是正确的,但成本极高。最终一致性在很多业务场景下完全可接受。选什么方案,不只是技术问题,还要考虑团队能力、运维成本、当前规模。架构师的价值,是在约束条件下找到最合适的方案,而不是总是选择技术上最优的方案。
下一篇:01 租户架构与资源治理