小编Dov*_*Dov的帖子

使用AWS ELB和RabbitMQ进行Celery连接

在我们的环境中,我们在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)

我们用:

  1. RabbitMQ 3.6.5
  2. 芹菜3.1.20
  3. 芹菜后端是pyamqp
  4. 芹菜结果后端是rpc

python rabbitmq amazon-web-services celery

15
推荐指数
1
解决办法
1199
查看次数

标签 统计

amazon-web-services ×1

celery ×1

python ×1

rabbitmq ×1