RabbitMq
如何保证消息的可靠性
Rabbit 消息传输路径是生产者到路由 到 队列 到消费者消费。
而Rabbit mq丢消息有以下几种情况
1生产者发送消息到RabbitMQ服务器过程中,RabbitMQ服务器如果宕机停止服务,消息会丢失。
RabbitMQ是支持消息持久化的,消息持久化需要设置:Exchange为持久化和Queue持久化,这样当消息发送到RabbitMQ服务器时,消息就会持久化。 消息持久化可以解决服务器突然宕机而产生的重启丢失。
但是生成者发送给路由的时候可能因为网络波动的原因导致没有发送到路由中这种时候我们就可以开启 confirm机制 在生产者发送到rabbitmq Servicer的时候通过两个回调函数
成功发送到exchange中返回confirm
成功分配到队列中返回returnedMessage
配置yml
spring:
rabbitmq:
publisher-confirms: true
# publisher-returns: true
template:
mandatory: true
# publisher-confirms:设置为true时。当消息投递到Exchange后,会回调confirm()方法进行通知生产者
# publisher-returns:设置为true时。当消息匹配到Queue并且失败时,会通过回调returnedMessage()方法返回消息
# spring.rabbitmq.template.mandatory: 设置为true时。指定消息在没有被队列接收时会通过回调returnedMessage()方法退回。
定义回调方法 把返回的消息存储到日志当中使用定时任务做进一步处理
confirm模式。它的作用是为了保障生产者投递消息到RabbitMQ不会出现消息丢失。
解决方法是让交换机给生成这返回ack 如果没有正确投递到路由器则返回nack则调用重发服务
4、消费者从RabbitMQ服务器获取队列中存储的数据消费,但是消费者程序出错或者宕机而没有正确消费,导致数据丢失
rabbitmq默认是开启自动签收机制的这样会导致消息到了目标消费者就会被签收这时候如果出现了异常或者服务器囧机消费没有被正确消费便会丢失消息。
这种时候我们可以开启事务ack机制
首先把签收方法设置成手动模式如何在程序完成消费之后调用basicAck手动确认签收
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?