0


RabbitMQ消息应答概念

学习笔记

生产者发送消息到队列中,消费者需要完成这个任务,并且处理信息,那么队列中的信息就会被删除掉;
那么如果消费者处理这个任务所需要的时间很长,队列中的信息已经被删除了,而消费者线程挂掉了;
那么就会造成这一条信息的丢失,这是不可取的。
所以需要一种消息应答机制来处理这一个问题。简而言之,就是消费者处理这条信息完成之后;
告诉mq这条信息已经处理完毕,然后mq才把这一条信息从队列中删除,这样就可以避免信息丢失的问题。

自动应答:当消费者接收到信息的时候,自动告诉mq处理完毕信息,及消息发送后立即被认为已经传送成功,但是实际上还没有处理完毕。
这种模式需要在高吞吐量和数据传输安全性方面做权衡。因为这种模式如果消息在接受之前,消费者那边出现连续或者channel关闭,那么消息就丢失了,
当然另一方面消费者可以传递过载的信息,没有对传输的消息数量进行限制。当然这样有可能使得消费者这边由于接收太多的消息而来不及处理,
导致这些消息的积压,最终导致内存耗尽,消费者线程被操作系统杀死。所以,
这种自动应答模式适用的前提是,有一个良好的环境,不能出错、消费者处理信息的速率相当高。

手动应答:手动应答的好处是可以批量应答并且减少网络拥堵。分为三个方法
A.Channel.basicAck(用于肯定确认)
MQ已经知道该消息被成功处理了,可以将其丢失了
B.Channel.basicNack(用于否定确认)
C.Channel.basicReject(用于否定确认)
比Channel.basicNack少一个参数
不处理该消息了直接拒绝,可以将其丢弃了

channel.basicAck(deliveryTag,true) true就代表multiple

multiple的true和false代表不同意思
true代表批量应答channel上未应答的消息
比如说channel上有传递tag的消息5,6,7,8当前tag是8 那么此时
5-8的这些还未应答的消息都会被确认收到消息应答
false同上面相比
只会应答tag=8的消息5,6,7这三个消息依然不会被确认收到信息应答

标签: rabbitmq java

本文转载自: https://blog.csdn.net/m0_55917971/article/details/131241658
版权归原作者 duyinboo 所有, 如有侵权,请联系我们删除。

“RabbitMQ消息应答概念”的评论:

还没有评论