【问题标题】:PRECONDITION_FAILED: Delivery Acknowledge Timeout on Celery & RabbitMQ with Gevent and concurrencyPRECONDITION_FAILED:使用 Gevent 和并发在 Celery 和 RabbitMQ 上的交付确认超时
【发布时间】:2021-11-03 16:36:50
【问题描述】:

我刚刚从 ForkPool 切换到 gevent,并发 (5) 作为在 Kubernetes pod 中运行的 Celery 工作人员的池方法。切换后,我在工作人员中遇到了不可恢复的错误:

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 小时),并且也遇到了同样的问题,所以这让我觉得可能有问题其他与问题相关的内容。

关于如何让员工更有弹性的任何想法或建议?

【问题讨论】:

    标签: kubernetes rabbitmq celery


    【解决方案1】:

    为了将来参考,新的 RabbitMQ 版本 (+3.8) 似乎为 consumer_timeout 引入了严格的默认值(我认为是 15 分钟)。

    我找到的解决方案(不久前here 也已添加到 Celery 文档中)是在 RabbitMQ 中为consumer_timeout 添加一个大数字。

    this question 中,有人提到将consumer_timeout 设置为false,这样就不需要使用大量数字,但显然有一些关于配置格式的细节才能使其起作用。

    我在 k8s 中运行 RabbitMQ,刚刚做了类似的事情:

    rabbitmq.conf: |
      consumer_timeout = 31622400000
    

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多