MQ 常见问题与最佳实践?

2025年 阅读约 15 分钟 面试指南 · 消息中间件

深入解析MQ常见问题与最佳实践:消息丢失/重复/积压/顺序性综合解决方案、MQ使用规范、监控运维体系、面试高频问题汇总,附面试模拟问答。

一句话总结

MQ 四大经典问题及解决方案:消息丢失(生产同步发送+Broker 同步刷盘+消费手动 ACK)、消息重复(幂等消费:唯一键/Redis/状态判断)、消息积压(扩容消费者+临时转储+降级处理)、消息顺序(分区有序:同一 key 发同一队列+串行消费)。最佳实践:Topic 命名规范消息体精简(只传 ID,查库获取详情)、消费幂等设计监控告警(积压/延迟/失败率)。

初级理解

MQ 使用规范

# Topic 命名规范 # 格式:{业务域}.{子业务}.{动作} # 示例: # order.create → 订单创建 # order.pay.success → 支付成功 # user.register → 用户注册 # inventory.deduct → 库存扣减 # Consumer Group 命名规范 # 格式:{业务域}-{服务名}-consumer # 示例: # order-order-service-consumer # user-sms-service-consumer # 消息体设计规范 # 1. 消息体尽量小(只传必要字段) # 2. 包含消息 ID(用于幂等) # 3. 包含时间戳(用于监控延迟) # 4. 包含业务 key(用于分区有序) # 消息体示例 { "msgId": "MSG20250101001", "timestamp": 1704067200000, "bizKey": "ORDER123456", "data": { "orderId": "ORDER123456", "userId": 1001, "amount": 99.00 } }

中级深入

四大问题综合方案

问题原因解决方案
消息丢失异步发送/Broker 宕机/自动 ACK同步发送+同步刷盘+手动 ACK
消息重复网络重试/Rebalance/超时重试幂等消费(唯一键/Redis/状态)
消息积压消费慢/消费者少/突发流量扩容+临时转储+降级处理
消息顺序多队列并行/重试/网络延迟分区有序+串行消费

消费最佳实践

# 消费端最佳实践 # 1. 幂等设计(必须) # 每条消息都能安全地重复处理 # 2. 快速消费 # 消费逻辑尽量简单,不做耗时操作 # 耗时操作异步化(如发短信、写日志) # 3. 异常处理 # 区分业务异常和系统异常 # 业务异常:不重试,记录日志 # 系统异常:重试,达到上限进死信 # 4. 批量消费 # 一次拉取多条消息,批量处理 # 减少网络开销,提高吞吐 # 5. 并发控制 # 合理设置消费线程数 # 注意数据库连接池大小

高级拓展

MQ 监控运维

# 监控指标 # 1. 消息积压(Lag) # RocketMQ:consumerOffset - maxOffset # Kafka:consumer lag # 告警:积压 > 10 万 # 2. 消费延迟 # 消息产生时间到消费时间的差值 # 告警:延迟 > 1 分钟 # 3. 消费 TPS # 每秒消费消息数 # 告警:TPS 下降 > 50% # 4. 消费失败率 # 消费失败次数 / 总消费次数 # 告警:失败率 > 1% # 5. Broker 健康 # CPU、内存、磁盘使用率 # 网络 IO、磁盘 IO # 运维工具 # RocketMQ:rocketmq-console(控制台) # Kafka:kafka-manager、Kafka Eagle # RabbitMQ:Management Plugin(自带)

MQ 使用注意事项

# 注意事项 # 1. 不要用 MQ 做数据库 # MQ 是消息通道,不是存储系统 # 消息有保存期限,过期会删除 # 2. 不要用 MQ 做 RPC # MQ 是异步的,不适合需要即时响应的场景 # 需要即时响应用 Feign/Dubbo # 3. 消息体不要太大 # 大消息影响性能,占用带宽 # 建议消息体 < 1MB # 大文件传 URL,消费者根据 URL 下载 # 4. 不要过度使用 MQ # MQ 增加系统复杂度 # 不是所有场景都需要 MQ # 简单场景直接调用即可 # 5. 做好降级方案 # MQ 不可用时怎么办? # 方案:本地队列兜底、数据库轮询补偿

实战场景

场景:MQ 全链路可靠性方案

# 完整方案 # 1. 生产端 # - 同步发送 + 失败重试 3 次 # - 仍失败 → 落库(消息补偿表) # - 定时任务扫描补偿表,重新发送 # 2. Broker 端 # - 同步刷盘(可靠性优先) # - 主从同步复制 # - 多副本(至少 3 副本) # 3. 消费端 # - 手动 ACK(处理完再确认) # - 幂等消费(消息 ID 去重) # - 异常重试 + 死信队列 # - 监控告警(积压/延迟/失败率) # 4. 补偿机制 # - 消息补偿表(生产端兜底) # - 死信队列(消费端兜底) # - 定时对账(最终一致性)

面试模拟

面试官:MQ 有哪些常见问题?怎么解决?

你:四大问题:消息丢失(全链路确认)、消息重复(幂等消费)、消息积压(扩容+转储+降级)、消息顺序(分区有序+串行消费)。每个问题都有对应的解决方案,需要全链路考虑。

面试官:使用 MQ 有哪些注意事项?

你:不要用 MQ 做数据库或 RPC,消息体不要太大(<1MB),做好幂等设计,做好降级方案(MQ 不可用时的兜底),建立完善的监控告警体系。