消息队列常见面试题
→ 返回 面试
MQ 用于异步解耦、削峰填谷、事件驱动。Kafka 专题见 Kafka常见面试题;架构见 消息队列、消息队列。
为什么用 MQ
| 价值 | 说明 |
|---|---|
| 异步解耦 | 生产者不等待消费者;下游扩缩容独立 |
| 削峰填谷 | 洪峰消息积压,消费者按能力拉取 |
| 广播 / 扇出 | 一条消息多服务消费(订单→库存/邮件/积分) |
| 可回溯 | Kafka 等按 offset 重放(日志、CDC) |
核心概念
Producer → Topic/Queue → Consumer Group
Partition(并行单位)
Offset(消费进度)
| 概念 | 说明 |
|---|---|
| Topic | 消息逻辑分类 |
| Queue | RabbitMQ 等队列模型 |
| Partition | 物理分片;分区内有序 |
| Consumer Group | 组内分摊分区;不同组各自消费全量 |
| Offset | 消费位置 |
消费语义(必考)
| 语义 | 含义 | 典型实现 |
|---|---|---|
| At Most Once | 最多一次,可能丢 | 先提交 offset 再处理 |
| At Least Once | 至少一次,可能重复 | 先处理再提交 offset(常见) |
| Exactly Once | 不丢不重(端到端难) | 幂等 + 事务 + 去重表 |
面试结论:分布式 MQ 默认至少一次;业务用幂等(唯一键、Redis NX、状态机)保证最终正确。
消息不丢三环节
Producer Broker Consumer
│ acks/confirm │ 持久化+副本 │ 手动 ACK / 后提交 offset
│ 重试 │ ISR 同步 │ 处理成功再确认
| 环节 | 要点 |
|---|---|
| 生产 | Kafka acks=all;RabbitMQ Publisher Confirm |
| 存储 | 磁盘持久化、多副本 |
| 消费 | 业务成功后再 ack;失败进 DLQ 重试 |
顺序消息
| 需求 | 做法 |
|---|---|
| 全局有序 | 单分区 / 单队列(吞吐低) |
| 业务键有序 | 相同 key 进同一分区(如 orderId) |
| 乱序可接受 | 多分区并行 |
延迟 / 死信
| 能力 | 代表 |
|---|---|
| 延迟消息 | RocketMQ 延迟级别;RabbitMQ TTL+DLX;Kafka 无原生(定时 Topic / 外部调度) |
| 死信队列 DLQ | 多次消费失败转入,人工或巡检修复 |
主流 MQ 选型
| MQ | 吞吐 | 延迟 | 特点 | 场景 |
|---|---|---|---|---|
| Kafka | 极高 | ms 级 | 日志型、可回放、分区 | 日志、CDC、事件流 |
| RocketMQ | 高 | ms 级 | 事务消息、延迟、顺序 | 电商、金融 |
| RabbitMQ | 中 | μs 级 | AMQP、路由灵活 | 传统业务、复杂路由 |
| Pulsar | 极高 | ms 级 | 存算分离、多租户 | 云原生 |
一句话:大数据 / 日志 / 流处理 → Kafka;复杂路由、低延迟任务 → RabbitMQ;国内电商事务延迟 → RocketMQ。
与数据库一致性
| 模式 | 说明 |
|---|---|
| 本地消息表 | 业务与消息表同事务;定时扫表发 MQ |
| 事务消息 | RocketMQ 半消息;Kafka 事务 Producer |
| CDC | Binlog → Kafka → 同步 ES/Redis |
常见面试题
Q:MQ 怎么削峰?
A:生产快于消费时消息积压在 Broker;消费者水平扩展;配合限流降级。
Q:重复消费怎么办?
A:消费端幂等:DB 唯一索引、Redis SET NX、业务状态机判断。
Q:Push vs Pull?
A:Push(Rabbit)Broker 推,需流控;Pull(Kafka)消费者拉,自控速率,易积压排查(Lag)。
Q:Kafka 和 RabbitMQ 核心区别?
A:Kafka 日志 + 分区 + offset 回溯;Rabbit 队列 + 路由 + ACK,偏任务与灵活拓扑。
相关笔记
- Kafka常见面试题
- 零拷贝 — Kafka 高性能之一
- Kafka
- 消息队列