gpt4 book ai didi

java - RabbitMQ 批量确认

转载 作者:行者123 更新时间:2023-11-29 04:43:28 25 4
gpt4 key购买 nike

我有一个关于 rabbitmq 如何处理批处理确认的问题。我知道 Prefetch 值是在达到其限制之前将排队的最大消息数。但是,我不确定 ack 是自行管理还是我必须在代码中管理它。

哪种方法是正确的?

发送每个 basicAck 并将 multiple 设置为 true

等到应该发送 10 个 ack 并只发送最后一个,AMQP 将自动发送队列中的所有前一个。 (多个设置为真)

最佳答案

TL;DR multiple = true 在某些情况下速度更快,但需要更仔细的簿记和类似批处理的要求

消费者获取的消息具有特定于该消费者的单调增长的 ID。 id 是一个 64 位数字(它实际上可能是一个无符号的 32 位,但因为 Java 没有它的长)称为交付标签。预取是消费者将收到的未确认的最多消息。

当您使用多个 true 确认最高交付标签时它将确认消费者未完成的具有较低传递标签(较小数字)的所有未确认消息。显然,如果你有高预取,这比确认每条消息要快。

现在 RabbitMQ 知道消费者收到了消息(未确认的消息),但它不知道是否所有这些消息都已被正确消费。因此,开发人员有责任确保之前的所有消息都已被使用。消费者将按顺序传递消息(我相信客户端在内部使用 BlockingQueue)但取决于下游使用的库/客户端,消息可能不是。

因此,这仅在您一次性将消息批处理(例如事务或将一组消息发送到其他系统)或可靠地缓冲时才有效。这通常是通过阻塞队列完成的,然后定期清空队列以将一组消息发送到下游系统。

另一方面,如果您实时流式传输每条消息,那么您就无法真正做到这一点(即 multiple = false)。

还有一种情况是消息中的一条在组中是坏的(例如从内部队列中排出......而不是兔子队列)并且你不会拒绝那个坏消息。如果是这种情况,您不能使用 multiple = true要么。

最后,如果您等待一定数量的消息(而不是说时间)超过预取,您将无限期地等待……这不是一个好主意。您需要按时等待,消息数量必须是<=预取。

如您所见,正确使用 multiple = true 并非易事。 .

关于java - RabbitMQ 批量确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38253380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com