Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 16 章 技术栈选型指南

技术栈选型不是列一个“流行组件清单”,而是把业务目标、团队能力、系统约束和长期治理成本放到同一张表里比较。一个组件能不能用,不只取决于性能指标,还取决于团队是否会运维、故障时是否能降级、数据是否能迁移、监控是否完整、未来是否会被业务规模反噬。

选型的基本顺序

技术选型建议按下面的顺序展开:

  1. 先明确业务目标:低延迟、高吞吐、强一致、快速迭代、成本可控,哪个是第一优先级。
  2. 再判断数据特征:事务数据、缓存数据、搜索数据、事件数据、分析数据不能混用一套存储思路。
  3. 再识别访问模式:读多写少、写多读少、热点集中、时间序列、复杂检索、批量导入各自对应不同设计。
  4. 再评估团队能力:是否有足够经验处理扩容、备份、回滚、监控、容量规划和故障演练。
  5. 最后决定演进路径:先用简单方案跑通业务,再在瓶颈明确后引入更重的基础设施。

这个顺序的核心是:不要为了展示技术复杂度而引入组件,要为了控制业务复杂度而选择工具。

常见组件的职责边界

组件适合解决的问题不适合承担的职责
MySQL权威数据、事务、状态机、审计高维全文检索、无限历史明细在线查询
Redis热点缓存、短期状态、原子扣减、限流计数长期权威存储、复杂事务关系
Kafka异步解耦、削峰、事件传播、可回放日志用户实时同步响应、强事务提交
Elasticsearch全文搜索、多条件筛选、聚合检索核心交易状态、强一致写路径
Kubernetes标准化部署、弹性、发布治理替代应用自身的降级、幂等、补偿设计

在系统设计面试和真实项目里,好的回答不是“这里用 Redis”,而是“这里用 Redis 承担短期热点读写,权威状态仍在 MySQL,并通过过期、回源和对账处理不一致”。组件本身只是方案的一部分,组件之间的边界和失败处理才是架构设计。

电商场景中的选型示例

电商系统天然会把多种组件放到同一条链路里。商品中心的主数据适合落 MySQL;商品搜索和筛选适合构建 Elasticsearch 索引;库存可售量可以用 Redis 承担高并发预扣,但库存流水和最终状态必须回到 MySQL;订单创建后的通知、积分、营销核销适合通过 Kafka 异步扩散。

这类组合的重点不是“组件越多越高级”,而是每个组件只承担自己擅长的职责,并在边界上设计好失败语义:

  • Redis 扣减成功但订单创建失败,要有释放或补偿。
  • Kafka 消息可能重复投递,消费者要幂等。
  • Elasticsearch 索引可能延迟,前台体验要接受短暂不一致。
  • MySQL 主从可能延迟,关键读路径要能读主或使用一致性读策略。

选型评审清单

做技术方案评审时,可以用下面的问题快速过滤风险:

问题判断点
这个组件解决的核心矛盾是什么?性能、可靠性、一致性、研发效率,不能混在一起说
不引入它会怎样?如果没有明确痛点,先保持简单
它失败时业务如何降级?超时、重试、降级、补偿必须能讲清
数据迁移和回滚怎么做?新旧链路并行、双写校验、灰度切换
谁负责运维和容量规划?没有人负责的组件就是未来事故源
它会不会改变团队开发方式?CQRS、事件驱动、微服务都会增加协作成本

技术栈选型的结论最好写进 ADR 或技术方案文档。这样后续团队复盘时,不只知道“当时选了什么”,还知道“为什么选、放弃了什么、风险如何接受”。