# 34 · 技术选型决策树
> 一句话点题:**技术选型不是在一堆工具里挑最强的,而是沿着需求、约束、阶段、团队能力和退出成本一路剪枝。成熟的选型,不是证明某个技术好,而是证明在当前约束下,它的收益配得上代价。**
---
> **🧰 技术栈选型篇第 8 章 · 本篇收束**
>
> 前 7 章分别讲了语言、数据库、缓存队列、API、部署、观测、AI 基础设施。这一章不再新增工具,而是给你一棵统一的决策树。以后遇到任何「要不要上 X」,都按这棵树走一遍。
---
## 开场:选型的根节点不是 A 还是 B
技术选型的第一个问题,不是:
```
PostgreSQL 还是 MongoDB?
REST 还是 gRPC?
PaaS 还是 K8s?
API 还是自建推理?
```
而是:
> 我们真的需要引入新技术吗?
如果现有技术栈能在目标性能、成本、可靠性和交付周期内解决问题,默认沿用现有栈。任何新技术都会带来学习成本、集成成本、运维成本和未来迁移成本。
这和前面反复说的克制是一脉相承的:能单体就别微服务,能工作流就别 Agent,能托管 API 起步就别自建 GPU。架构师把选型理解成**为一个明确问题支付一笔明确成本**。
---
## 一、第一刀:现在处在哪个阶段
同一个系统,不同阶段答案完全不同:
| 阶段 | 最缺什么 | 选型倾向 |
|---|---|---|
| **MVP** | 验证速度 | 少组件、主流栈、托管优先、低迁移成本 |
| **成长期** | 可控增长 | 可观测、灰度、边界清晰、能局部扩展 |
| **规模期** | 效率与成本 | 深度优化、平台化、单位成本、自动化治理 |
| **关键期** | 稳定与合规 | 审计、隔离、容灾、SLO、事故流程 |
一个技术在成熟期是正确答案,在 MVP 可能就是过度设计。验证需求时,优先少组件;支撑增长时,优先可控;优化规模时,才值得为单位成本、吞吐和深度定制付出复杂度。
---
## 二、第二刀:系统会先死在哪里
当确认现有栈不够,不要马上找工具,先定位失败模式:
| 失败模式 | 优先看 |
|---|---|
| 数据错、状态对不上 | 数据模型、事务边界、幂等、Outbox、对账 |
| 读热点打爆主库 | 缓存、读模型、CDN、限流 |
| 写洪峰压垮后端 | 队列、背压、削峰、异步状态 |
| P99 被扇出放大 | API 边界、超时预算、降级、trace |
| 发布容易出事故 | 部署平台、灰度、回滚、配置治理 |
| 出事定位困难 | 指标、日志、链路追踪、SLO 告警 |
| AI 质量漂移 | eval、trace、RAG 评测、模型路由 |
| 团队协作卡住 | 模块边界、平台工程、服务 ownership |
> **判断句:**工具只是答案的外壳,失败模式才是选型的题目。
---
## 三、第三刀:团队能不能养得起
很多技术在 benchmark(基准测试)里很好看,但你的团队不一定养得起。养得起包括:
- 会不会部署?
- 会不会排障?
- 有没有监控?
- 线上坏了谁能修?
- 版本升级会不会炸?
- 有没有足够多的人理解它?
一个「性能更强但没人会修」的系统,在生产里常常输给「性能够用但团队熟悉」的系统。技术选型不是实验室比赛,而是长期运营合同。要把可运维性和关键人员风险写进判断,否则选中的不是技术,是未来事故。
---
## 四、第四刀:能不能退出
成熟的选型一定有退出方案:
| 技术 | 退出问题 |
|---|---|
| 新数据库 | 数据怎么迁移?双写如何校验?回滚到哪里? |
| 模型供应商 | API 能否适配?提示和 eval 能否复用? |
| 框架 | 业务逻辑是否被框架吞掉?能否分层隔离? |
| 消息系统 | topic / schema / 消费位点如何迁移? |
| 云平台 | 镜像、配置、密钥、存储、网络能否移走? |
没有退出路线的选型,就是把未来绑死。重要技术进入生产前,至少要有 Spike(小实验)、灰度计划、回滚方案和 ADR。
---
## 五、统一决策树
```
要不要引入新技术?
│
├─ 现有栈能满足目标? ── 是 ─▶ 沿用 + 局部优化
│
└─ 否
│
├─ 现在是 MVP? ── 是 ─▶ 选最少组件、最快验证、低迁移成本
│
└─ 否
│
├─ 失败模式是什么?
│ ├─ 数据/一致性 → 先看存储与事务边界
│ ├─ 延迟/吞吐 → 先看缓存、批处理、扩展方式
│ ├─ 可用性/失败 → 先看冗余、降级、隔离
│ ├─ AI 质量 → 先看 eval、RAG、模型路由
│ └─ 团队协作 → 先看模块边界、平台能力
│
└─ 候选方案能否被团队养住、能否退出?
├─ 不能 → 换轻一点的方案
└─ 能 → Spike 验证 → 写 ADR → 灰度采用
```
---
## 六、技术选型 ADR 模板
```md
### ADR-034:引入 OpenTelemetry 统一链路追踪
- 背景:订单请求跨 7 个服务,P99 偶发超过 2s,只有各服务日志,定位一次问题平均 3 小时。
- 目标:把跨服务请求路径和每跳耗时串起来,把 MTTR(平均恢复时间)降到 30 分钟以内。
- 候选:
- 继续加日志:成本低,但无法稳定还原调用路径。
- 引入私有追踪方案:定制强,但未来迁移困难。
- 使用 OpenTelemetry:埋点标准化,后端可替换。
- 选择:使用 OpenTelemetry 采集 trace,先覆盖订单、库存、支付三条关键链路。
- 放弃:短期增加埋点工作和采样治理成本。
- 换来:慢请求能跨服务定位,后续可接不同观测后端。
- 复审条件:采样成本超过预算,或关键链路覆盖率低于 90%,重新评估采样策略和埋点规范。
- 退出方案:保留标准 trace context,观测后端可替换;业务代码不绑定某个厂商 SDK。
```
ADR 的重点不是格式,而是把「为什么选」和「选错怎么退」写清楚。
---
## 七、总表:每章的核心判断
| 章节 | 不要先问 | 先问 |
|---|---|---|
| [27](27-编程语言与后端框架选型.md) 语言/框架 | 哪个语言更先进 | 团队、生态、运行时、业务复杂度匹配吗 |
| [28](28-数据库与存储选型.md) 数据库/存储 | 哪个数据库最强 | 事实源是谁,查询形态是什么 |
| [29](29-缓存消息队列与事件系统选型.md) 缓存/队列/事件 | 要不要上 Kafka | 是读热点、时间错配,还是业务事实广播 |
| [30](30-API与服务通信选型.md) API/通信 | REST 还是 gRPC | 同步/异步、内部/外部、契约强度是什么 |
| [31](31-云原生与部署平台选型.md) 部署平台 | 要不要 K8s | 团队是否需要并养得起平台能力 |
| [32](32-可观测性与可靠性技术栈选型.md) 观测/可靠性 | 用哪个监控工具 | 用户 SLO 是什么,事故怎么收场 |
| [33](33-AI基础设施技术栈选型.md) AI 基础设施 | 要不要自建 GPU | 稀缺资源是模型、上下文、成本、质量还是可控性 |
---
## 🎯 随堂检验
---
## 本章小结
- **选型的根节点是「要不要新技术」**:现有栈能满足目标,默认沿用。
- **阶段决定答案**:MVP 买速度,成长期买可控,规模期买效率,关键期买稳定与合规。
- **先定位失败模式,再比较工具**:数据、延迟、成本、质量、协作,对应的是不同问题。
- **团队养得起才算选得上**:可运维性比纸面性能更接近生产真相。
- **好选型必须能退出**:Spike 验证、ADR 记录、灰度采用、保留迁移路线。
> **技术栈选型篇收束**:这 8 章不是让你记住更多技术名,而是训练一句话:**先看约束,再选技术;先承认代价,再享受收益。** 接下来读 `templates/` 和 `cases/` 时,你可以反过来问每一个系统:它为什么是这套技术栈?如果约束换了,答案会不会变?
---
## 相关链接
- 方法论本体:[02 · 架构师的思考框架](02-架构师的思考框架.md) · [06 · 质量属性与取舍](06-质量属性与取舍.md) · [08 · 架构决策记录与演进](08-架构决策记录与演进.md) · [09 · 架构品味](09-架构品味.md)
- 练习入口:[templates/README](../templates/README.md) · [cases/README](../cases/README.md)
- 本篇回看:[27](27-编程语言与后端框架选型.md) · [28](28-数据库与存储选型.md) · [29](29-缓存消息队列与事件系统选型.md) · [30](30-API与服务通信选型.md) · [31](31-云原生与部署平台选型.md) · [32](32-可观测性与可靠性技术栈选型.md) · [33](33-AI基础设施技术栈选型.md)