low*_*e00 13 rabbitmq celery kubernetes
我刚刚从 ForkPool 切换到 gevent,并使用并发性 (5) 作为在 Kubernetes Pod 中运行的 Celery Worker 的池方法。切换后,我在工作人员中遇到了不可恢复的错误:
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 小时),并且也遇到了同样的问题,所以这让我认为可能还有其他相关的问题问题。
关于如何让员工更有弹性有什么想法或建议吗?
Sar*_*ang 13
接受的答案是正确的答案。但是,如果您有现有的 RabbitMQ 服务器正在运行并且不想重新启动它,则可以通过在 RabbitMQ 服务器上运行以下命令来动态设置配置值:
rabbitmqctl eval 'application:set_env(rabbit, consumer_timeout, 36000000).'
这会将新超时设置为 10 小时(36000000 毫秒)。为了使其生效,您需要重新启动您的工作人员。现有的工作连接将继续使用旧的超时。
您还可以检查当前配置的超时值:
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".
希望这可以帮助!
为了将来的参考,新的 RabbitMQ 版本(+3.8)似乎引入了严格的默认值consumer_timeout(我认为是 15 分钟)。
我找到的解决方案(不久前也已添加到 Celery 文档中)是在 RabbitMQ 中添加大量数字consumer_timeout。
在这个问题中,有人提到将consumer_timeout设置为false,这样就不需要使用大量的数字,但显然有一些关于配置格式的具体细节可以使其工作。
我在 k8s 中运行 RabbitMQ 并做了类似的事情:
rabbitmq.conf: |
consumer_timeout = 31622400000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12120 次 |
| 最近记录: |