我刚从ForkPool切换到gevent,使用并发(5)作为在Kubernetes吊舱中运行的芹菜工人的池方法。在开关之后,我得到了一个无法恢复的错误:
amqp.exceptions.PreconditionFailed: (0, 0): (406) PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more
代理日志提供了基本相同的消息:
2021-11-01 22:26:17.251 [warning] <0.18574.1> Consumer None4 on channel 1 has timed out waiting for delivery acknowledgement. Timeout used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more
我已经设置了CELERY_ACK_LATE
,但不熟悉为确认期间设置超时的必要性。在使用过程之前从来没有发生过这种情况。任务可以相当长(有时是60-120秒),但我无法找到允许这样做的特定设置。
我在其他论坛的另一篇文章中看到,一位用户将代理配置上的超时设置为大量(比如24小时),并且也遇到了同样的问题,因此我认为可能还有一些与这个问题相关的东西。
关于如何使工人更有弹性,有什么想法或建议吗?
发布于 2022-03-05 01:40:20
发布于 2022-10-02 19:40:13
接受的答案是正确的答案。但是,如果您有一个现有的RabbitMQ服务器正在运行,并且不想重新启动它,您可以通过在RabbitMQ服务器上运行以下命令动态地设置配置值:
rabbitmqctl eval 'application:set_env(rabbit, consumer_timeout, 36000000).'
这将将新的超时设置为10小时(360000ms)。但是,要使其生效,您需要重新启动员工。现有的员工连接将继续使用旧的超时。
还可以检查当前配置的超时值:
rabbitmqctl eval 'application:get_env(rabbit, consumer_timeout).'
如果您通过Docker映像运行RabbitMQ,下面是如何设置值:只需将-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit consumer_timeout 36000000"
添加到docker run
或将环境RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS
设置为"-rabbit consumer_timeout 36000000"
即可。
希望这能有所帮助!
https://stackoverflow.com/questions/69828547
复制相似问题