面试知识

技术选型与解决方案设计

51-技术选型与解决方案设计 面试知识整理。

技术选型与解决方案设计

1. 简历关联点

技术选型是架构师面试高频题。面试官不是想听“我会 Redis(远程字典服务)、MySQL(关系型数据库)、MQ(消息队列)”,而是想听你为什么选、什么时候不用、风险是什么、怎么迁移、如何兜底。

本模块用于准备:

  • 数据库、缓存、MQ(消息队列)、搜索、时序、对象存储的选型。
  • 单体、微服务、分库分表、读写分离、异步化的方案选择。
  • 高可用、高并发、高一致性场景下的解决方案。
  • 架构方案如何写成能落地的工程计划。

2. 技术选型主线

技术选型建议按八个维度回答:

维度要回答的问题
业务匹配解决的核心业务问题是什么
数据规模数据量、QPS(每秒查询率)、峰值、增长率
一致性强一致、最终一致、可丢弃、可补偿
性能RT(响应时间)、吞吐、并发、热点
可用性单点故障、容灾、降级
成本机器、人力、学习、维护成本
团队能力团队是否能运维和排障
演进风险迁移、扩容、兼容、回滚

一句话模板:

我选型时不会只看性能指标,而会结合业务一致性要求、数据规模、团队运维能力和迁移成本。优先选团队能掌控、满足当前规模、支持未来演进的方案。

3. 常见组件选型

3.1 MySQL(关系型数据库)还是 NoSQL(非关系型数据库)

选型适合场景不适合场景
MySQL(关系型数据库)强事务、结构化数据、复杂查询超大规模写入、非结构化文档
PostgreSQL(关系型数据库)复杂 SQL(结构化查询语言)、地理数据、扩展能力团队缺少运维经验
MongoDB(文档数据库)文档结构灵活、字段变化频繁强事务和复杂关联
ClickHouse(列式数据库)大宽表分析、报表、聚合高频点查、强事务
Elasticsearch(搜索引擎)全文搜索、多条件检索资金一致性、强事务

面试表达:

订单、支付、库存这类核心交易数据,我优先放 MySQL(关系型数据库),因为需要事务、约束和审计;物流轨迹和搜索可以同步到 Elasticsearch(搜索引擎);报表分析可以进入 ClickHouse(列式数据库);不是为了新技术而拆数据源。

热门面试题

  1. 问题(基础题):为什么订单主数据不建议直接放 Elasticsearch(搜索引擎)?

    • 考点:主数据、事务、一致性。
    • 回答思路:Elasticsearch(搜索引擎)适合检索,不适合作为强一致交易主库;订单主数据要保证事务、约束和审计。
    • 进阶追问:搜索数据和主库不一致怎么办?
  2. 问题(原理题):ClickHouse(列式数据库)为什么适合报表?

    • 考点:列式存储、压缩、聚合。
    • 回答思路:列式存储只读取查询需要的列,压缩率高,适合大批量聚合分析。
    • 进阶追问:为什么不适合高频事务写入?
  3. 问题(项目追问题):跨境物流轨迹怎么选存储?

    • 考点:写入量、查询模式、归档。
    • 回答思路:近期轨迹可放 MySQL(关系型数据库)或 MongoDB(文档数据库)支撑查询,搜索场景同步 Elasticsearch(搜索引擎),历史轨迹归档到低成本存储。
    • 进阶追问:轨迹重复上报怎么去重?

3.2 Redis(远程字典服务)用还是不用

Redis(远程字典服务)适合低延迟、高频访问、临时状态、分布式协调的场景,但不能随便替代数据库。

场景是否适合 Redis(远程字典服务)说明
热点商品库存预扣适合需要原子操作和低延迟,但要有数据库兜底
支付流水主状态不适合单独使用资金状态必须可审计、可事务化
短期幂等键适合设置过期时间,降低重复请求
长期业务状态谨慎需要持久化和一致性设计
排行榜/延迟队列适合ZSet(有序集合)天然支持分值排序

热门面试题

  1. 问题(基础题):Redis(远程字典服务)适合做什么?

    • 考点:缓存、计数、锁、延迟队列。
    • 回答思路:适合低延迟访问、热点缓存、短期状态、原子计数、分布式锁和 ZSet(有序集合)延迟队列。
    • 进阶追问:Redis(远程字典服务)宕机会不会影响主链路?
  2. 问题(原理题):为什么 Redis(远程字典服务)不能作为所有数据的事实来源?

    • 考点:持久化、事务、审计、一致性。
    • 回答思路:Redis(远程字典服务)虽然有持久化,但不适合承载所有强一致和审计要求,核心交易数据仍要落数据库。
    • 进阶追问:库存预扣用 Redis(远程字典服务)后如何和数据库对齐?
  3. 问题(项目追问题):库存防超卖如何组合 Redis(远程字典服务)和 MySQL(关系型数据库)?

    • 考点:缓存加速、数据库兜底、补偿。
    • 回答思路:Redis(远程字典服务)用于热点预扣和削峰,MySQL(关系型数据库)用条件更新保证最终不超卖,异步对账修正异常。
    • 进阶追问:Redis(远程字典服务)扣成功但数据库失败怎么办?

3.3 MQ(消息队列)选型

组件适合场景关键词
Kafka(分布式日志消息系统)高吞吐日志、轨迹、行为流高吞吐、分区、回放
RocketMQ(分布式消息队列)订单、交易、事务消息事务消息、延迟消息、可靠性
RabbitMQ(消息队列)路由灵活、传统企业集成Exchange(交换机)、Routing Key(路由键)

面试表达:

如果是物流轨迹或日志流,我倾向 Kafka(分布式日志消息系统);如果是订单支付这类需要事务消息、延迟消息和业务可靠性的场景,我更倾向 RocketMQ(分布式消息队列);如果是路由模型复杂、存量系统集成,RabbitMQ(消息队列)也有价值。

热门面试题

  1. 问题(基础题):为什么要引入 MQ(消息队列)?

    • 考点:削峰、解耦、异步、最终一致性。
    • 回答思路:MQ(消息队列)用于削峰、解耦和异步处理,也能承载最终一致性事件流。
    • 进阶追问:引入 MQ(消息队列)会带来什么复杂度?
  2. 问题(原理题):Kafka(分布式日志消息系统)和 RocketMQ(分布式消息队列)怎么选?

    • 考点:吞吐、事务、业务消息。
    • 回答思路:Kafka(分布式日志消息系统)强在高吞吐日志流,RocketMQ(分布式消息队列)更适合交易业务消息和事务消息。
    • 进阶追问:顺序消息怎么保证?
  3. 问题(项目追问题):支付成功后通知库存、物流、积分如何设计?

    • 考点:事件驱动、幂等、补偿。
    • 回答思路:支付状态落库后发领域事件,下游各自消费,消费者幂等,失败进入重试和死信,最终通过对账补偿。
    • 进阶追问:消息发出失败怎么办?

4. 解决方案设计模板

4.1 通用方案结构

背景:业务问题和现状
目标:功能目标和质量目标
约束:规模、成本、团队、时间
方案:核心架构和技术选型
链路:主流程、异常流程、补偿流程
风险:一致性、性能、可用性、安全、成本
观测:日志、指标、链路、告警
演进:第一阶段、第二阶段、长期方案

4.2 技术选型决策矩阵

方案性能一致性成本复杂度团队掌控结论
单库事务早期优先
Redis(远程字典服务)预扣 + DB(数据库)确认中高高并发库存
MQ(消息队列)最终一致性最终一致中高跨服务解耦
TCC(Try Confirm Cancel,尝试确认取消)低中强一致跨服务

5. 架构图与流程图

5.1 技术选型流程

flowchart TD
    A["业务问题"] --> B["数据规模和峰值"]
    B --> C["一致性要求"]
    C --> D["团队能力和运维成本"]
    D --> E["候选方案"]
    E --> F["风险评估"]
    F --> G["阶段性落地"]
    G --> H["监控验证和演进"]

6. 项目落地话术

6.1 分库分表选型话术

我不会一开始就分库分表。先看数据量、增长速度、查询模式和瓶颈。如果主要是慢查询,先做索引、SQL(结构化查询语言)优化、冷热分离和归档;如果单表数据和写入压力确实超过单库承载,再考虑分库分表。分片键要优先贴近核心查询,比如订单按用户或商户,库存按 SKU(库存单位)和仓库。还要提前考虑跨库分页、全局 ID(标识)、扩容迁移和数据校验。

6.2 MQ(消息队列)最终一致性话术

我会先让本地事务保证本服务状态正确,再通过可靠消息驱动下游。消息可能重复、延迟、乱序,所以消费者必须幂等,状态流转要有版本或状态机。失败消息进入重试和死信,最终通过补偿任务和对账保证业务闭环。

7. 高频面试题与追问

  1. 问题:你如何做技术选型?

    • 回答思路:按业务目标、规模、一致性、性能、成本、团队能力和演进风险做矩阵,不从技术偏好出发。
  2. 问题:如何判断该不该引入 MQ(消息队列)?

    • 回答思路:当需要削峰、解耦、异步或最终一致性时引入;同时评估可靠性、幂等、积压和运维成本。
  3. 问题:什么时候不该用微服务?

    • 回答思路:业务边界不稳定、团队规模小、部署治理能力不足、事务强耦合时,不适合过早拆微服务。

8. 本模块复习清单

  • 能用八维度讲技术选型。
  • 能解释 MySQL(关系型数据库)、Redis(远程字典服务)、MQ(消息队列)、Elasticsearch(搜索引擎)、ClickHouse(列式数据库)怎么选。
  • 能把技术选型讲成业务目标和架构取舍。
  • 能说明为什么不用某个技术。
  • 能用决策矩阵回答方案对比题。

9. 精通级分册入口与学习路线

根文档完整保留既有正文,作为兼容入口;本节只追加分册导航、事实边界和复核统计,不以导航替换原有学习内容。原正文收口基线的 SHA-256(安全散列算法)为 4bc464a4bde2711b5b1d359475dee9eafac48e0a25b2375414a8aa783668d54f

9.1 七篇分册与七张正式图

顺序分册入口主训练目标正式图
00工作负载证据边界与选型路线从业务目标、工作负载和不变量建立可撤销的选型输入工作负载路线源图 / 渲染图
01候选矩阵淘汰条件与多模型边界用硬门禁、敏感性分析和权威数据边界比较候选方案候选矩阵源图 / 渲染图
02POC(概念验证)风险实验验收与失败成本设计可证伪实验、验收标准与失败成本控制风险实验源图 / 渲染图
03Build vs Buy(自建还是采购)供应商风险与控制边界比较自建、采购与供应商锁定风险,明确控制责任自建采购源图 / 渲染图
04成本退出路径兼容与迁移决策用单位成本、兼容性与退出演练约束长期选择退出迁移源图 / 渲染图
05解决方案设计评审实施计划与验收把选型结论转为实施计划、验收证据和复审动作方案评审源图 / 渲染图
06技术选型项目口述排障与综合题库将选型判断收束为项目口述、故障排查和综合答题故障域源图 / 渲染图

七张正式图均由一份 PlantUML(统一建模语言)源文件和一张 PNG(便携式网络图形)渲染图组成;源文件与渲染图分别按 pumlpng 扩展名统计。

9.2 事实边界、推荐顺序与快速复习

  • E0(待核对):未找到源码、运行记录或原始业务凭证;只能说明待核对项和核对动作。
  • E1(源码与可复现证据):可由源码、配置、脚本、原始事件或可复现实验直接核验的事实。
  • E2(已有材料映射):来自现有简历、项目材料或已成稿模块的可追溯映射,不外推为新的线上结论。
  • E3(演练证据):用于复算机制、容量、失败窗口或验收方法的假设输入与演练结果,不代表真实生产指标、服务等级协议或项目收益。

推荐首次学习顺序为 00 -> 01 -> 02 -> 03 -> 04 -> 05 -> 06:先固定工作负载与证据边界,再完成候选淘汰、风险实验、自建采购比较、退出迁移与方案验收,最后用项目口述和综合题检验表达。快速复习时,从本根的“技术选型主线”“解决方案设计模板”和“项目落地话术”恢复框架;面试前压缩练习时,先阅读 00 分册 的输入边界,再练习 06 分册 的口述与排障题。

9.3 分册统计与复核口径

统计范围仅为 51-技术选型与解决方案设计/ 下的 00-06 七篇 Markdown(标记语言)分册,不含本根兼容正文。知识标记按既有 HTML(超文本标记语言)注释计数;六字段题要求“问题、考点、回答思路、详细答案、进阶追问、进阶回答”六个字段在同一知识题块各恰好一次;口述答案按相应字段计数。Mermaid(图表语法)按围栏计数,时序图按围栏内 sequenceDiagram 计数;标准表按表头紧随 Markdown(标记语言)分隔行计数;数据演绎按 E3(演练证据)演绎标题计数;图资源按目录内 puml/png 文件计数。

分册知识标记六字段题口述答案Mermaid(图表语法)/时序图标准表E3(演练证据)数据演绎puml/png
00824149 / 6128见七图总计
0113392613 / 101313见七图总计
0213392613 / 101313见七图总计
0313392613 / 101313见七图总计
0412362012 / 9120见七图总计
0512362012 / 12120见七图总计
0612364512 / 101212见七图总计
合计8324917784 / 6787597 / 7

复核结果:interview_kb_audit 对本模块全部 Markdown(标记语言)文件审计为 0 个问题;固定 mmdc(Mermaid 命令行工具) 11.4.2 对七篇分册 84 张 Mermaid(图表语法)图真实渲染通过 84 / 84,连同本根 1 张图后为全模块 85 / 85,输出均非空;7 组 PlantUML(统一建模语言)源文件与 PNG(便携式网络图形)渲染图均非空。