1. 核心概念
可靠性投递(Reliable Delivery)是指确保消息从生产者成功到达消费者,即使面对网络故障、系统崩溃等异常情况也能保证不丢失、不重复、按顺序(部分场景)传递。
2. 面临的挑战
- 网络不可靠:丢包、延迟、分区
- 节点故障:生产者/消费者/中间件宕机
- 重复消费:确认机制可能引发重复
- 顺序保证:分布式环境下消息乱序
3. 关键实现机制
3.1 生产端保证
// 伪代码示例:生产端确认模式
public void sendWithConfirm(Message msg) {
// 1. 持久化到本地数据库(防丢失)
messageDao.save(msg);
// 2. 发送到消息队列
String msgId = rabbitTemplate.convertAndSend(msg);
// 3. 等待 Broker 确认
boolean ack = waitForAck(msgId, TIMEOUT);
// 4. 失败重试(指数退避)
if (!ack) {
retryWithBackoff(msg);
}
// 5. 最终记录投递状态
updateDeliveryStatus(msgId, ack);
}
技术要点:
- 事务机制:同步方式,性能差(不推荐)
- 确认机制(Confirm):
- 普通确认(每消息确认)
- 批量确认(提高吞吐)
- 异步监听(最佳实践)
- 本地消息表:事务消息的替代方案
- 消息持久化:设置
delivery_mode=2
3.2 Broker 端保证
消息处理流程:Producer → Broker 接收 → 持久化存储 → 推送给 Consumer → 等待 ACK → 删除/重投
持久化策略:
- 队列持久化:
durable=true - 消息持久化:
delivery_mode=2 - 镜像队列:多副本冗余(RabbitMQ)


