RabbitMQ如何保证消息发送消费成功
Posted supingemail
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ如何保证消息发送消费成功相关的知识,希望对你有一定的参考价值。
好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受。
目录
消息因为其:削峰,异步,解耦的特性,被很多公司的很多工程师所用。RabbitMQ 为MQ实现的中间件之一,是如何保证消息发送成功,并且消费成功的呐?
1.发送确认机制设置
要得到rabbitmq发送消息被接收并且消费成功,必须是设置confirm 模式,即设置信道需要为 confirm 信任模式,则所有在信道上发布的消息都会分配一个唯一 ID(也可以根据业务情况手动分配一个messageID),消息被投递到exchange交换机,再投递给消费者,在消费者消费成功确认后,会给生产者(包含消息唯一ID)返回确认信息,告知生产者,消息消费成功。
信道信任确认模式配置如下图所示:
2.消息丢失、非信任或失败
如果 RabbitMQ发生内部错误从而导致消息丢失,消息消息者就会接收不到消息;如果消息的信息ID为空,会发送一条ack消息给生产者为非信任消息。
如果消息被消费失败,则会告知生成者,消息消费失败,会被nack给rabbitmq,消息信息会在次返回到队列中,不会被清除,信道处理消息返回队列设置如下:
所有被发送的消息都将被 ack 或者被nack一次。但是没有对消息被ack 或nack 的快慢做任何保证,并且同一条消息不会既被 ack又被nack。
3.消息重复消费
消息在没有做好控制的情况下,可能会重复消费,所以需要判断是否重复消费
4.消费成功通知
消息在被消费成功之后,会告诉rabbitmq,生产者发送的消息,已经被我成功消费了。
5.总结
5.1.发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者,生产者的回调方法会被触发。
5.2 ConfirmCallback接口:只确认是否正确到达 Exchange 中,成功到达则回调。
5.3 ReturnCallback接口:消息失败返回时回调。
5.4 消费者在声明队列时,可以指定noAck参数,当noAck=false时,rabbitmq会等待消费者显式发回ack信号后才从内存(或者磁盘,持久化消息)中移去消息。否则,消息被消费后会被立即删除5.5 消费者接收每一条消息,处理完业务逻辑后须进行确认,只有消费者确认了消息,rabbitmq才能安全地把消息从队列中删除。
5.6 rabbitmq不会为未ack的消息设置超时时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开。这么设计的原因是rabbitmq允许消费者消费一条消息的时间可以很长。保证数据的最终一致性;
5.7 极端情况下,如果消费者返回ack之前断开了链接,rabbitmq会重新分发给下一个订阅的消费者,这样可能存在重复消费,需要在编码的时候特别注意。
以上是关于RabbitMQ如何保证消息发送消费成功的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 SpringBoot+RabbitMQ 保证消息100%投递成功并被消费?(附源码)