我有一个问题,关于狂犬病和批次确认是如何工作的。据我所知,Prefetch值是在达到极限之前将排队的最大消息数。但是,我不确定是攻击者自己管理,还是必须用代码来管理。
哪种方法是正确的?
将具有多个集的每个basicAck发送为true
或
等待到10个被认为是被发送出去,只发送最后一个,AMQP将自动发送所有前面的队列。(多个设置为true)
发布于 2017-09-15 17:37:33
在某些情况下,TL;DR multiple = true更快,但需要更仔细的簿记和批处理(类似于)
消费者获得的消息具有特定于该消费者的单调增长的标识。id是一个64位数字(实际上它可能是一个无符号的32位,但因为Java没有它的长),所以称为传递标记。预取是消费者收到的最多未加标记的消息。
当您使用多个true对最高的传递标记进行包装时,它将使用较低的传递标记(较小的数量)来确认所有未加加的消息,这些消息是消费者尚未完成的。显然,如果您有较高的预取,这比添加每条消息更快。
现在,RabbitMQ知道消费者收到了消息(未加标记的消息),但它不知道是否正确地使用了所有这些消息。因此,确保所有先前的消息都已被使用,这是开发人员的责任。使用者将按顺序传递消息(我相信客户端内部使用BlockingQueue),但取决于下游使用的库/客户端,消息可能不是。
因此,只有在一次性将消息批次(例如,事务处理或将一组消息发送到其他系统)或可靠缓冲时,这才能很好地工作。这通常是通过阻塞队列完成的,然后周期性地耗尽队列以向下游系统发送一组消息。
另一方面,如果您正在实时地传输每条消息,那么您就不能真正做到这一点(即multiple = false)。
还有一种情况是,其中一条消息在组中是坏的(例如,从内部队列中排出.(不是兔子排队),你不会抓到那个坏的。如果是这样的话,也不能使用multiple = true。
最后,如果您等待一定数量的消息(而不是时间)超过预取,您将无限期地等待..。不是个好主意。您需要等待时间,并且消息数量必须是<=预取。
正如您所看到的,正确使用multiple = true是相当重要的。
发布于 2016-07-08 08:09:01
第一个关于Prefetch value is the max number of messages that will get queued before reaching its limit.的更正--这不是预取值;预取值是消费者从队列“获取”的未加标记消息的数量。因此,它们被分配给消费者,但在它们被确认之前一直处于队列中。引用这里,当预取值为1时
这告诉RabbitMQ一次不能给工人一个以上的消息。或者,换句话说,在员工处理并确认上一条消息之前,不要向它发送新消息。
至于你的问题:
我不确定这个密码是自己管理,还是必须用代码来管理。
您可以将自动ack标志设置为true,然后可以说是the ack's manage themselves
https://stackoverflow.com/questions/38253380
复制相似问题