当 auto_ack=False 时,RabbitMQ ack 超时错误

abh*_*rni 7 twisted rabbitmq scrapy

我正在使用 Twisted 的 RabbitMQ 消费者,详见此处。我有一个简单的网络爬虫(scrapy,也基于 Twisted),其中我使用要从 RabbitMQ 队列中爬取的 URL,一旦爬取的数据被处理(成功或失败),我会发回确认并重新排队请求(我正在使用延迟消息插件,因此不会立即重新抓取 URL,而是仅在指定的时间增量之后重新抓取)。

处理爬取的数据只需要不到一分钟(最坏的情况)。我在单个 CPU 单线程程序上运行爬虫。我知道 RabbitMQ 的heartbeat逻辑,因此我hearbeat=0pika.ConnectionParameters.

但是,大约一个小时的爬行后,我收到以下错误:

rabbitmq_1  | 2021-05-10 13:57:14.448 [warning] <0.1576.0> Consumer ctag1.9daa292d7d304072836de1e3f2dc540e on channel 1 has timed out waiting on consumer acknowledgement. Timeout used: 900000 ms
rabbitmq_1  | 2021-05-10 13:57:14.654 [error] <0.1576.0> Channel error on connection <0.1569.0> (172.18.0.4:52344 -> 172.18.0.2:5672, vhost: '/', user: 'guest'), channel 1:
rabbitmq_1  | operation none caused a channel exception precondition_failed: consumer ack timed out on channel 1
scrapy_1    | 2021-05-10 13:57:15 [pika.channel] WARNING: Received remote Channel.Close (406): 'PRECONDITION_FAILED - consumer ack timed out on channel 1' on <Channel number=1 OPEN conn=<pika.adapters.twisted_connection._TwistedConnectionAdapter object at 0x7f010f9b8b80>>
Run Code Online (Sandbox Code Playgroud)

该错误表示某些 ack 在超时 90000 毫秒后超时,但是,我在处理一个小时后收到此错误。

有什么线索吗?