Jer*_*myK 3 java amqp rabbitmq
我有一个关于rabbitmq如何处理批处理确认的问题。据我所知,预取值是在达到限制之前排队的最大消息数。但是,我不确定 ack 是否可以自行管理,或者是否必须在代码中进行管理。
哪种方法是正确的?
发送每个 basicAck 并将多个设置为 true
或者
等到应该发送 10 个 ack 并仅发送最后一个,AMQP 将自动发送队列中的所有先前的确认。(多个设置为 true)
TL;DR multiple = true 在某些情况下速度更快,但需要更仔细的簿记和批量要求
消费者收到的消息具有特定于该消费者的单调增长的 id。id 是一个 64 位数字(它实际上可能是一个无符号的 32 位,但由于 Java 没有它,所以它是一个 long),称为传递标签。预取是消费者将收到的未确认的最多消息。
当您确认具有多个的最高传递标签时,true它将确认消费者尚未处理的具有较低传递标签(较小数字)的所有未确认消息。显然,如果你有较高的预取,这比确认每条消息要快。
现在 RabbitMQ 知道消费者收到了消息(未确认的消息),但它不知道所有这些消息是否已被正确使用。因此,开发人员有责任确保所有先前的消息都已被消耗。消费者将按顺序传递消息(我相信客户端在内部使用 BlockingQueue),但根据下游使用的库/客户端,消息可能不会。
因此,只有当您在一次中将消息批量处理在一起(例如事务或将一组消息发送到某个其他系统)或可靠地缓冲时,这才真正有效。通常,这是通过阻塞队列来完成的,然后定期清空队列以将一组消息发送到下游系统。
另一方面,如果您实时传输每条消息,那么您实际上无法做到这一点(即 multiple = false)。
还有一种情况是,组中的一条消息是坏消息(例如,从内部队列中排出......而不是兔子队列),并且您不会拒绝那个坏消息。如果是这种情况,您也不能使用 multiple = true。
最后,如果您等待一定数量的消息(而不是说时间)超过预取,您将无限期地等待......这不是一个好主意。您需要准时等待,并且消息数量必须是<=预取的。
正如您所看到的,正确使用多个 = 相当重要true。
| 归档时间: |
|
| 查看次数: |
3377 次 |
| 最近记录: |