distributed-systems · git:20260920.a4843f5 · 2026-09-20 · sha256 4fbcacd8d64509df
distributed-systems git:20260920.a4843f5A
Immutable. This exact content is served forever at /api/v1/blob/4fbcacd8d64509df.
--- 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 有数字与依据 ### 故障演练与混沌工程 - 阶梯:为什么要主动注入故障 → 注入什么(延迟、断连、依赖挂、资源耗尽)、在哪个环境、爆炸半径怎么控 → 演练发现的典型问题(超时链、重试风暴、降级不生效)→ 演练频率、自动化与业务方的配合 - 答实的标志:做过或设计过故障注入;有演练发现并修掉的问题;知道爆炸半径的控制手段