---
name: distributed-systems
description: 分布式系统深挖：一致性与共识、分布式事务、幂等与恰好一次、锁与时钟、微服务治理、热点写入、多活。
keywords: [分布式, distributed systems, 一致性, 共识, raft, 分布式事务, saga, tcc, 幂等, exactly once, 分布式锁, 时钟, 微服务, 服务治理, 热点, 多活, 容灾, 混沌工程]
layer: detail
domains: [backend]
---

## 面试官在意什么

这本把后端包里"分布式"三个字下面的东西挖开：数据在多台机器上怎么保持一致、跨服务的操作失败一半怎么办、同一条消息来两次怎么只做一次、机房挂了怎么活。面试官不考 CAP 的背诵，考的是候选人在自己系统里选了哪种一致性、代价是什么、出过什么一致性事故。二面与架构面重点。

## 项目 / 实习怎么深挖

简历上出现下面这类经历时从哪里切、追什么。追到候选人能说出机制、数字的来源与一次真实的故障或取舍才算实；只有框架名与结论、说不出自己那一段的，记为危险信号。通用的追问方法见 project-deep-dive。

- 简历出现分布式事务 / Seata / Saga → 追为什么需要、补偿失败怎么办、有没有出过不一致、对账怎么做
- 简历出现微服务拆分 → 追按什么拆、拆完最痛的问题、有没有合并过、数据归属怎么定
- 简历出现秒杀 / 库存 / 热点 → 追怎么扛并发写、热点行锁怎么处理、异步落库与对账
- 简历出现分布式锁 → 追用什么实现、过期与续期、脑裂时会怎样、为什么不用数据库唯一键
- 简历出现多活 / 容灾 → 追数据怎么同步、冲突怎么解、切换演练过没有
- 简历出现"恰好一次" → 追靠什么保证（幂等键、事务消费、去重表）、重复消费出过没有

## 常见失守与危险信号

- 一致性与共识：只会背 CAP；说不出 Raft 选主与日志复制的流程；不知道自己系统是哪种一致性
- 分布式事务与一致性：只会说"用 Seata"；把最终一致当成不一致；不知道补偿也会失败
- 幂等与恰好一次：认为 MQ 能保证恰好一次；幂等靠数据库唯一索引报错却没考虑并发与体验
- 分布式锁与时钟：Redis 锁没考虑过期与续期；不知道依赖系统时钟的风险
- 服务拆分与微服务治理：认为微服务天然更好；拆分依据是技术层而不是业务边界；没考虑数据归属
- 高并发写入与热点处理：直接 update 库存表扛并发；不知道热点行锁；没有异步落库与对账
- 多活与容灾：只说"两地三中心"；不知道数据同步延迟与冲突；从没演练过切换
- 故障演练与混沌：没做过故障注入；不知道自己系统挂哪个依赖会整体不可用

## 常考主题清单

只列名字、阶梯与答实的标志，作"问到哪一层算实"的参考；问哪些、问几道由这份 JD 与这份简历定，不是配额。

### 分布式事务与一致性
- 阶梯：为什么跨服务不能用数据库事务 → 2PC、TCC、Saga、本地消息表各自的模型与代价 → 补偿失败、悬挂、空回滚这些边界情况怎么处理 → 业务上能不能通过重新定义流程避开分布式事务
- 答实的标志：优先考虑通过预占、状态机、异步核对避开强一致；TCC 有 try 阶段资源预留的具体设计；有对账与人工兜底；能量化一致性窗口

### 服务拆分与微服务治理
- 阶梯：为什么拆、什么时候不该拆 → 按什么边界拆（领域、团队、变更频率），共享数据库为什么是反模式 → 拆完之后调用链变长、分布式事务、联调困难怎么办 → 单体、模块化单体、微服务的成本对比
- 答实的标志：绞杀者模式逐步迁移；数据先解耦再服务解耦；有服务注册发现、配置中心、统一网关的认识但不迷信；能说出拆过头之后的合并案例

### 高并发写入与热点处理
- 阶梯：秒杀、抢券这类场景难在哪 → 库存扣减放 Redis 还是数据库，Lua 原子操作与数据库行锁的对比 → 热点行锁等待、Redis 单 key 打满单分片怎么办 → 准确性、公平性、吞吐三者怎么排优先级
- 答实的标志：前置拦截（本地限流、排队）、Redis 预扣、异步落库、对账补偿；热点 key 拆分；请求合并；能说出 Redis 宕机时的兜底

### 一致性模型与共识
- 阶梯：强一致、线性一致、最终一致各承诺什么 → Raft 的选主、日志复制、成员变更；为什么多数派能保证不丢 → 脑裂、时钟漂移、网络分区下系统各会怎样 → 自己系统选了哪种一致性、代价是什么；什么业务能接受最终一致
- 答实的标志：能讲清 Raft 一轮写入的流程；知道自己系统的一致性级别与依据；有分区或脑裂的推演

### 幂等与恰好一次
- 阶梯：为什么分布式下重复是常态 → 幂等键、去重表、事务消费、版本号各解决什么 → 同一条用户请求重复提交、消费者重启后重复消费、补偿重复执行各怎么防 → 恰好一次的真实含义（至少一次 + 幂等）；幂等键的生命周期与存储成本
- 答实的标志：幂等设计有具体键与存储；知道恰好一次靠什么组合；有重复消费的事故与修法

### 分布式锁与时钟
- 阶梯：分布式锁解决什么、什么时候其实不需要 → Redis 锁的过期、续期、释放别人锁的问题；ZooKeeper / etcd 锁的差别 → 依赖系统时钟的风险（租约、过期、排序）；单调时钟与逻辑时钟 → 锁的性能与可用性取舍；用数据库唯一约束替代锁的场景
- 答实的标志：能说出 Redis 锁的三个坑；知道时钟不可信的具体后果；有用约束代替锁的判断

### 多活与容灾
- 阶梯：同城双活、异地多活、两地三中心各解决什么 → 数据同步的延迟与冲突（双写、单元化、按用户路由）→ 一次机房故障的切换时间线；切换后数据怎么对账 → RPO / RTO 怎么定、成本多少、什么业务值得
- 答实的标志：能说出单元化的路由依据；有切换演练或推演；RPO / RTO 有数字与依据

### 故障演练与混沌工程
- 阶梯：为什么要主动注入故障 → 注入什么（延迟、断连、依赖挂、资源耗尽）、在哪个环境、爆炸半径怎么控 → 演练发现的典型问题（超时链、重试风暴、降级不生效）→ 演练频率、自动化与业务方的配合
- 答实的标志：做过或设计过故障注入；有演练发现并修掉的问题；知道爆炸半径的控制手段
