一句话总结
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 不可用时的兜底),建立完善的监控告警体系。