Rabbit的ACK学习

2020-11-18  本文已影响0人  Spring_java

参考文章:https://blog.csdn.net/weixin_38380858/article/details/84963944

面板介绍

Image 4.jpg

ACK介绍

无ack模式(AcknowledgeMode.NONE)默认全部成功

消息丢失的风险

当BlockingQueue<Runnable>堆满时(BlockingQueue<Delivery>一定会先满),server端推送消息会失败,然后断开connection。
消费端从Socket读取Frame将会抛出SocketException,触发异常处理,shutdown掉connection和所有的channel,channel shutdown后WorkPool中的channel信息(包括channel inProgress,channel ready以及Map)全部清空,所以BlockingQueue<Runnable>中的数据会全部丢失。

此外,消费者服务重启时也需对内存中未处理完的消息做必要的处理,以免丢失。
在rabbitmq server,connection断掉后就没有消费者去消费这个queue,因此在server端会看到消息堆积的现象。

有ack模式(AcknowledgeMode.AUTO,AcknowledgeMode.MANUAL)

server端行为

有ACK的模式不会丢消息,但效率较低,因为server端需要等收到消费端的答复之后才会继续推送消息,当然,推送消息和等待答复是异步的,可适当增大prefetchCount提高效率。

上一篇 下一篇

猜你喜欢

热点阅读