消息队列是分布式系统里非常常见的组件。它能削峰填谷、解耦系统、异步处理任务但也会带来一批新的问题消息会不会丢会不会重复消费顺序还能不能保证消费失败怎么重试积压了怎么恢复很多人使用 MQ 时只关注“发消息”和“消费消息”两个动作但真正上线后决定系统稳定性的往往是可靠性治理能力。第一先明确 MQ 的可靠性边界。消息从生产者到消费者中间至少经过三个阶段生产者发送到 BrokerBroker 存储消息消费者拉取或接收消息并处理完成。任何一个阶段都可能失败。生产者可能发送超时网络可能抖动Broker 可能写入失败消费者可能处理异常消费完成后提交确认也可能失败。所以可靠性不是一个单点配置而是一整套链路设计。第二生产端要保证消息可靠投递。生产端最常见的问题是业务数据已经写入数据库但消息发送失败导致下游永远不知道这件事发生过。解决这个问题常见做法是本地消息表或事务消息。本地消息表的思路是业务数据和待发送消息在同一个本地事务里落库。事务提交后由后台任务扫描消息表并发送 MQ。发送成功后更新消息状态。如果发送失败就继续重试。这种方案实现简单稳定性好缺点是链路稍长会引入一定延迟。事务消息则由 MQ 中间件提供半消息和事务回查能力。它能减少本地轮询逻辑但对中间件能力和业务实现要求更高。无论用哪种方式核心目标都是一个业务操作成功后消息最终一定能发出去。第三消费端必须做幂等。在 MQ 系统里要默认消息可能重复。重复消息不一定是 Bug而是可靠投递机制带来的自然结果。比如消费者处理成功了但提交 ack 时网络异常Broker 没收到确认就可能再次投递同一条消息。生产者发送超时后重试也可能导致重复消息。因此消费者不能假设“每条消息只来一次”而应该设计成“同一条消息多次执行结果仍然正确”。常见幂等方案有几种使用业务唯一键比如订单号、支付流水号、请求 ID。建立消费记录表处理前先判断该消息是否已经成功消费。利用数据库唯一索引防重比如对 message_id 或业务单号建立唯一约束。对状态机类业务做状态判断比如订单已支付就不要重复扣款。幂等设计的关键不是“防止重复消息出现”而是“重复出现也不会造成错误结果”。第四顺序消息要控制范围。很多业务说自己需要顺序消费但实际上并不是全局有序而是局部有序。比如订单状态变更只要求同一个订单的消息顺序一致不要求所有订单全局排序。库存扣减只要求同一个商品或同一个库存维度有序。全局有序代价很高通常意味着只能使用一个队列或一个分区吞吐会明显下降。更常见的做法是按业务 key 分区。例如同一个 orderId 的消息发送到同一个队列或分区让同一业务对象的消息保持顺序。这样既能保证局部顺序又能保留一定并发能力。顺序消息还要注意消费失败。如果前一条消息一直失败后面的消息是否继续处理如果必须严格有序就只能阻塞等待或进入人工处理如果允许局部跳过就要有补偿机制。第五重试不能无限放大故障。消费失败后重试是必要的但重试策略必须谨慎。最怕的是下游服务已经故障消费者还在高频重试结果把下游打得更严重。更合理的方式是分级重试第一次失败后短间隔重试连续失败后拉长间隔多次失败后进入死信队列。死信队列不是垃圾桶而是异常消息的隔离区。进入死信后应该有告警、排查、修复和重新投递机制。对于明确不可恢复的错误比如参数非法、业务状态不存在不应该一直重试。对于临时性错误比如网络超时、限流、数据库短暂不可用才适合重试。第六消息积压要先判断原因。消息积压通常有三类原因生产速度突然变快消费速度变慢消费者出现异常。排查时先看生产速率、消费速率、消费者实例数、单条消息耗时、失败率和重试量。如果是短期流量高峰可以临时扩容消费者提高消费并发。如果是单条消息处理变慢要继续追下游数据库、RPC、缓存或锁竞争。如果是大量失败重试造成积压要先止血避免失败消息反复占用消费能力。如果积压已经很严重还要评估消息时效性。有些消息过期后已经没有业务价值可以按规则丢弃或走补偿有些消息必须处理就需要扩容、批处理或临时旁路消费。第七监控和告警必须提前建设。MQ 可靠性治理离不开监控。至少要关注生产成功率、发送耗时、消费成功率、消费耗时、堆积量、堆积时长、重试次数、死信数量、消费者在线数量。其中堆积时长比堆积数量更直观。堆积 1 万条消息不一定严重如果几秒能消费完影响不大但如果最早的消息已经延迟 30 分钟就必须处理。告警也要分级。普通波动可以记录趋势持续积压和死信增长必须及时通知核心业务消息失败要高优先级处理。消息队列不是用了就天然可靠。它只是提供了异步通信能力真正的可靠性来自业务侧的设计生产端保证最终投递消费端保证幂等顺序要求控制在合理范围失败重试要有节奏死信队列要能闭环积压治理要有预案。总结一下MQ 上线前至少要问自己六个问题消息发送失败怎么办重复消费会不会出错是否真的需要全局顺序消费失败如何重试死信消息谁来处理积压后怎么恢复这些问题都有答案消息队列才能从“能用”变成“可靠可控”。封面使用 built-in image_gen 生成并已复制到outputs目录。核心风格提示词是“纸感背景、手绘箭头、杂志信息图、清爽技术插画”。