消息队列常见面试题

返回 面试

MQ 用于异步解耦、削峰填谷、事件驱动。Kafka 专题见 Kafka常见面试题;架构见 消息队列消息队列


为什么用 MQ

价值说明
异步解耦生产者不等待消费者;下游扩缩容独立
削峰填谷洪峰消息积压,消费者按能力拉取
广播 / 扇出一条消息多服务消费(订单→库存/邮件/积分)
可回溯Kafka 等按 offset 重放(日志、CDC)

核心概念

Producer → Topic/Queue → Consumer Group
              Partition(并行单位)
              Offset(消费进度)
概念说明
Topic消息逻辑分类
QueueRabbitMQ 等队列模型
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、事件流
RocketMQms 级事务消息、延迟、顺序电商、金融
RabbitMQμs 级AMQP、路由灵活传统业务、复杂路由
Pulsar极高ms 级存算分离、多租户云原生

一句话:大数据 / 日志 / 流处理 → Kafka;复杂路由、低延迟任务 → RabbitMQ;国内电商事务延迟 → RocketMQ


与数据库一致性

模式说明
本地消息表业务与消息表同事务;定时扫表发 MQ
事务消息RocketMQ 半消息;Kafka 事务 Producer
CDCBinlog → 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,偏任务与灵活拓扑。


相关笔记