分布式系统面试题精选

2025年 阅读约 13 分钟 面试指南 · 系统设计

精选分布式系统面试高频题目,涵盖CAP理论、分布式事务、一致性算法、消息队列等核心知识点。

一句话总结

分布式系统面试考察理论基础,核心考点:CAP理论(CP vs AP选择)+ BASE(最终一致性)、分布式事务(2PC/TCC/Saga/可靠消息)、一致性算法(Paxos/Raft/ZAB)、消息队列(RabbitMQ/Kafka/RocketMQ 对比+消息可靠性)。

CAP与BASE理论

CAP理论:分布式系统无法同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),最多满足两个。

由于网络分区不可避免,实际选择是CP或AP:

CP系统:ZooKeeper、Etcd——保证一致性,可能牺牲可用性。

AP系统:Eureka、Cassandra——保证可用性,可能返回旧数据。

BASE理论:Basically Available(基本可用)、Soft State(软状态)、Eventually Consistent(最终一致性)。是CAP中AP的延伸。

分布式事务

2PC(两阶段提交):协调者先询问所有参与者,全部同意后提交。问题:同步阻塞、单点故障、数据不一致风险。

TCC(Try-Confirm-Cancel):业务层面的两阶段提交。Try预留资源,Confirm确认执行,Cancel取消回滚。代码侵入性强。

Saga模式:长事务拆分为多个本地事务,每个事务有补偿操作。适合业务流程长的场景。

可靠消息最终一致性:利用消息队列确保最终一致性。本地消息表或事务消息。

一致性算法

Paxos:分布式一致性算法的基石,Basic Paxos难以工程实现。

Raft:易于理解的共识算法。核心:Leader选举 + 日志复制。三种角色:Leader、Follower、Candidate。

选举过程:Follower超时后变为Candidate,获得多数票后成为Leader。Leader心跳维持权威。

ZAB协议:ZooKeeper使用,类似Raft,支持崩溃恢复和消息广播。

消息队列

消息队列的作用:异步处理、流量削峰、应用解耦。

常见MQ对比:

RabbitMQ:Erlang实现,功能丰富,适合中小规模。

Kafka:Scala/Java实现,高吞吐,适合大数据和日志场景。

RocketMQ:Java实现,事务消息支持好,适合电商场景。

常见问题:消息丢失(发送确认+持久化+消费确认)、消息重复(幂等处理)、消息顺序(分区有序)、消息积压(增加消费者+临时扩容)。

实战场景

场景:分布式事务——下单扣库存(可靠消息最终一致性)

// 订单服务:创建订单 + 发送消息(本地事务) @Transactional public void createOrder(Order order) { orderMapper.insert(order); // 1. 插入订单 txLogMapper.insert(new TxLog(order.getId())); // 2. 插入事务日志(同库同事务) mq.send("order-created", order); // 3. 发送消息 } // 库存服务:消费消息 + 扣库存(幂等) @RocketMQMessageListener(topic = "order-created") public void onMessage(OrderEvent event) { if (deductLogMapper.exists(event.getOrderId())) return; // 幂等检查 stockMapper.deduct(event.getSkuId(), event.getQty()); // 扣库存 deductLogMapper.insert(new DeductLog(event.getOrderId())); // 记录已处理 } // 定时任务:检查未确认的事务日志,重新发送消息 @Scheduled(fixedDelay = 60000) public void checkUnconfirmed() { List<TxLog> logs = txLogMapper.findUnconfirmed(5, TimeUnit.MINUTES); logs.forEach(log -> mq.send("order-created", log.getOrder())); }