在我们的环境中,我们在AWS上使用RabbitMQ和Celery在许多节点上并行运行任务.
最近,我们将RabbitMQ转换为3个节点的集群,配置了ha策略,并为所有3个节点添加了端口5672的AWS弹性负载均衡器(ELB).我们的Celery工作者和客户端代码都使用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
Run Code Online (Sandbox Code Playgroud)
我们用: