如何保证RabbitMQ消息的可靠传输?

在这个图中,消息可能丢失的场景是1,2,3

1.在生产者将消息发送给RabbitMQ的时候,消息到底有没有正确的到达服务器呢,RabbitMQ提供了两种解决方案:

a. 通过事务机制实现(比较消耗性能,此处不展开)

b. 通过发送方确认(publisher confirm)机制实现

发送方确认:

RabbitMQ提供了两个方式来控制消息的可靠性传递

1.confirm确认模式

2.return退回模式

confirm确认模式:

在producer发送消息的是和,对发送端设置一个ConfirmCallback的监听,无论消息是否到达Exchange,这个监听都会执行,如果Exchange成功收到,ACK会确认为true,如果没收到消息ACK就为false。

2.消息在交换机中无法路由到指定队列:

可能原因:代码或者配置层面错误,导致消息路由失败。

return退回模式:

消息到达Exchange之后, 会根据路由规则匹配, 把消息放⼊Queue中. Exchange到Queue的过程, 如果⼀条消息⽆法被任何队列消费(即没有队列与消息的路由键匹配或队列不存在等), 可以选择把消息退回给发送者. 消息退回给发送者时, 我们可以设置⼀个返回回调⽅法, 对消息进⾏处理.
3.消息队列自身数据丢失:
可能原因:消息到达rabbitMQ中,mq宕机导致消息丢失
解决办法:开启RabbitMQ持久化,就是把消息写入磁盘中,如果RabbitMQ挂了,重启之后会自动读取磁盘中的数据恢复到内存中(但是,还是有一些非常极端的情况,RabbitMQ还未将全部数据持久化到磁盘中,服务器就挂了,还是会导致一些数据丢失的,可以通过集群来提高可靠性)
4.消费者异常,导致消息丢失(也就是上图中3那个过程)
可能原因:消息到达消费者,还没来得及消费,消费者宕机或者消费者逻辑有问题
解决办法:RabbitMQ提供了消费者应答机制,来使得RabbitMQ能够感知到消费者是否成功消费消息,默认情况下是自动应答的,但是一些比较重要的场景和近期相关的,我们也可以手动确认,当消费者确认消费信息成功之后才会删除消息,从而避免消息丢失,除此之外,也可以配置重试机制,当消息消费异常时,通过消息重试确保消息的可靠性。

相关推荐
添乱8 分钟前
「Java案例」猜数字游戏
java
添乱8 分钟前
「Java案例」求n1-n2内的素数
java
cloudy49111 分钟前
Java 各种 IO 模型端口转发性能对比实测(BIO、NIO、AIO、虚拟线程)
java·性能优化
天天摸鱼的java工程师20 分钟前
MyBatis Plus 的实用技巧:从业务场景到代码实现
java·后端·mybatis
wuxuanok1 小时前
Web后端开发-Mybatis
java·开发语言·笔记·学习·mybatis
带刺的坐椅1 小时前
Java MCP 实战:构建跨进程与远程的工具服务
java·ai·solon·mcp
yt948321 小时前
C#实现CAN通讯接口
java·linux·前端
卷到起飞的数分1 小时前
Java零基础笔记07(Java编程核心:面向对象编程 {类,static关键字})
java·开发语言·笔记
舌尖上的五香2 小时前
ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal
java
okok__TXF2 小时前
Sentinel入门篇【流量治理】
java·sentinel