gpt4 book ai didi

python - Celery 与 AWS ELB 和 RabbitMQ 的连接中断

转载 作者:太空狗 更新时间:2023-10-29 17:08:32 27 4
gpt4 key购买 nike

在我们的环境中,我们使用 AWS 上的 RabbitMQ 和 Celery 在多个节点上并行运行任务。

最近我们将 RabbitMQ 变成了一个由 3 个节点组成的集群,配置了一个 ha 策略,并为所有 3 个节点的端口 5672 添加了一个 AWS 弹性负载均衡器 (ELB)。我们的 Celery worker 和客户端代码都使用 ELB DNS 作为代理 URL。

自该更改以来,我们注意到等待异步任务完成将引发异常 IOError: Socket closed

ELB 将在 60 秒后关闭所有空闲连接。我们的任务需要几个小时才能完成。

将 BROKER_HEARTBEAT 设置为低于 60 的值可解决工作端的连接中断。但是我们似乎找不到任何可以使客户端连接保持事件状态的设置。

这是使用 Celery 等待长时间运行任务的正确方法吗?

我们尚未测试的一种解决方法是调用 AsyncResult.wait() 方法,直到它成功结束。例如:

async_result = task.delay(params)

while True:
try:
async_result.wait()
break
except IOError:
pass

我们使用:

  1. RabbitMQ 3.6.5
  2. celery 3.1.20
  3. Celery 后端是 pyamqp
  4. Celery 结果后端是 rpc

最佳答案

我相信您需要做的是延长 AWS ELB 的超时时间。正在发生的事情是连接在任务完成之前被关闭。您可以通过发出以下命令来完成此操作

elb-modify-lb-attributes myTestELB --connection-settings "idletimeout=3600" --headers

这会给您一个小时的时间来完成任务。参见 https://aws.amazon.com/blogs/aws/elb-idle-timeout-control/有关这方面的更多信息。

如果一个小时还不够,那么您将不得不禁用连接池。将这两个设置添加到您的 celery 配置中

BROKER_POOL_LIMIT = None
BROKER_TRANSPORT_OPTIONS = {'confirm_publish': True}

第二个会影响性能,因为它会增加一些开销。由于您有长时间运行的任务,这可能不是问题。第二个设置可能不是必需的,但我建议您使用负载均衡器。此设置将确保消息在接收过程中不会丢失。

另一种选择是将您的长任务也分解为更小的任务!这可能意味着更多的代码,但从长远来看可能是值得的。

关于python - Celery 与 AWS ELB 和 RabbitMQ 的连接中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41040257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com