我正在使用RPC模式通过RabbitMQ处理对象。
您怀疑我有一个对象,并且想要完成该过程,然后将确认发送给RPC客户端。
默认情况下,Ack的超时时间约为3分钟。
我的过程需要很长时间。
我该如何为每个对象的确认更改超时时间,或者如何处理类似的进程?
答案 0 :(得分:10)
现代版本的 RabbitMQ 有一个 delivery acknowledgement timeout:
<块引用>在现代 RabbitMQ 版本中,对消费者强制执行超时 交货确认。这有助于检测有问题(卡住)的消费者 从不承认交付。这样的消费者可以影响节点的 磁盘数据压缩和潜在的驱动节点的磁盘空间。
如果消费者没有确认其交付超过超时 值(默认为 15 分钟),其通道将关闭 PRECONDITION_FAILED 通道异常。该错误将由 消费者连接到的节点。
错误信息为:Channel error on connection <####> : operation none caused a channel exception precondition_failed: consumer ack timed out on channel 1
默认超时为 15 分钟(900000 毫秒),由 consumer_timeout
中的 rabbitmq.conf
参数配置
答案 1 :(得分:2)
RabbitMQ不提供任何类型的超时机制来确认消息。官方Python教程对此进行了讨论:
There aren't any message timeouts; RabbitMQ will redeliver the message only when the worker connection dies. It's fine even if processing a message takes a very, very long time.
AMQP 0-9-1规范的第3.1.8节描述了确认,并且非常清楚它们可以是自动的(客户端无需执行任何操作,消息在传递后即得到确认)或显式(客户端必须为已处理的每条消息或每组消息都添加一个确认)。
这是2009年的一些讨论,证实了这种情况。
所以:是的,如果您需要超时以在某个时间间隔后自动发送NACK,则您必须自己这样做。