权衡与取舍:没有银弹的决策艺术
一、架构即权衡:常见维度
架构决策很少是「对与错」,多是「在 A 和 B 之间选哪个更符合当前目标与约束」。下面三组是出现频率很高的权衡维度。
更快往往意味着更多资源(机器、缓存、专有硬件)或更贵的中间件。要明确「快到哪里够用」,避免无上限追性能导致成本失控。
分布式下强一致常以可用性或延迟为代价(如 CP 与 AP 的取舍)。要根据业务场景定「多强的一致、多高的可用」可接受。
可配置、可扩展意味着更多抽象与分支,复杂度和维护成本上升。要问「我们真需要多少灵活性」,避免过度设计。
「一致性 vs 可用性」在分布式系统里常画成一条轴:往左偏强一致、往右偏高可用,中间是各种折中(如最终一致、读写分离)。下面这张图示意:在一条轴上选一个点,就是一次取舍;不同业务会选不同位置。
记住: 没有银弹,只有显式的取舍。把「我们在这几个维度上选了什么、为什么」说清楚,比追求「什么都最好」更现实、也更容易复盘。
二、如何显式列出选项与标准、做比较
权衡要「显式」做,而不是凭感觉拍板。推荐四步:列选项 → 定标准 → 比较 → 记录;下图是决策流程的直观概括。
- 列选项:至少 2 个,最好 3 个(含「维持现状」或「最小改动」)。避免只有单一方案就推进。
- 定标准:从目标与约束抽出可比较的维度,如成本、性能、可维护性、风险、实施周期。能量化的尽量量化(如 QPS、延迟、人天);不能量化的用「高/中/低」或简短说明。
- 比较:用矩阵表逐项打分或标注,标出每个选项的优缺点,再综合选一个,并写清「选 A 而非 B 的理由」。
下面是一个简化的决策矩阵示例(存储选型):
| 选项 | 成本 | 性能 | 可维护性 | 风险 | 结论 |
|---|---|---|---|---|---|
| MySQL 主从 | 低 | 中 | 高(团队熟) | 低 | 当前量级首选 |
| NewSQL(TiDB) | 中高 | 高 | 中 | 中(运维新) | 量上来再评估 |
| 分库分表自研 | 中 | 高 | 低 | 高 | 不选 |
案例:某次要在「自研任务调度」和「用 XX 云 Scheduler」之间选。团队列了标准:开发成本、运维成本、与现有 K8s 的集成、扩展性。矩阵比较后认为当前规模用云 Scheduler 成本更低、上线快,但扩展性受限于云产品;决定先采用云 Scheduler,并约定「若未来需要更复杂策略再评估自研」。选哪个不是重点,标准透明、理由可查才是。
三、决策记录与复盘(ADR)
重要决策建议写成架构决策记录(Architecture Decision Record,ADR):标题、背景、选项、决策、理由、后果与后续。这样以后换人、复盘或审计时能还原「当时为什么这么选」。
ADR-001:订单与库存交互采用同步调用 + 超时与重试
背景:下单需扣减库存,需决定同步 vs 消息异步。
选项:(1)同步 HTTP 调用(2)发消息异步扣减(3)预占 + 异步确认。
决策:采用(1),超时 2s,重试 1 次,失败则订单失败并提示。
理由:当前量级同步可接受;强一致、实现简单;若后续量上来再评估(2)(3)。
后果:库存服务故障会直接导致下单失败,需保障库存可用性。
复盘时对照 ADR:当时假设是否还成立?若重来会否改选?若会,更新 ADR 或新开一篇「superseded by ADR-002」即可,决策史保留。
四、在不确定下做可逆决策
当信息不足、或未来变化大时,优先选可逆的路径:例如先上云托管、合同期短,而不是自建锁死三年;先做小范围试点再全量,而不是一次全改。不可逆的决策(如删库、换核心系统、大架构推倒重来)要更谨慎、更多验证与审批。
例如:先用 SaaS,不满意再迁;先单机房,再双活;先同步调用,再改异步。成本可控、可回滚时,可以更快试错、根据反馈调整。
例如:数据格式破坏性变更、核心存储迁移、全量架构替换。需要更多论证、分阶段、留回滚窗口,或明确「逆转的代价我们接受」。
反例:不显式权衡、不记录,事后说不清。
某次选型定了「用 A 中间件」,没有写选项对比和理由。半年后 A 出问题,有人提议换 B,但没人能说清「当时为什么选 A、现在换 B 的代价和收益是否值得」。讨论会变成「我觉得 B 好」「我觉得 A 还能撑」,无法基于事实与标准决策。若当时有一页 ADR:背景、选项 A/B/C、选 A 的理由(如成本、团队熟悉度)、后果(如依赖厂商),现在只需更新「现状与假设变化,拟评估 B,结论见 ADR-002」即可。不记录权衡与理由,复盘和迭代都会失焦。
小结: 架构即权衡,常见维度有性能与成本、一致性与可用性、灵活与简单。要做显式权衡:列选项、定标准、做比较并记录。用ADR记录背景、选项、决策、理由与后果,便于复盘与传承。在不确定下优先选可逆决策,不可逆决策要更谨慎并留验证与回滚空间。
五、小结
权衡与取舍是架构师的日常:没有银弹,只有显式的取舍。常见维度包括性能与成本、一致性与可用性、灵活与简单。通过列选项、定标准、做比较做显式决策,并用ADR记录背景、选项、决策、理由与后果。在不确定时优先可逆决策,不可逆决策要加倍谨慎。下一章我们会讲边界与接口:如何定义清晰边界与稳定接口,让协作顺畅。