如何使用 Celery 和 RabbitMQ 设置分布式工作池

Posted

技术标签:

【中文标题】如何使用 Celery 和 RabbitMQ 设置分布式工作池【英文标题】:How to set up a distributed worker pool with Celery and RabbitMQ 【发布时间】:2016-12-01 14:38:06 【问题描述】:

我对这种事情还是很陌生,所以我完全有可能搞错了。

我正在尝试建立一个分布式任务系统。我有一个使用 Celery 生成任务的 Django webapp。现在,我的 webapp、worker 和 RabbitMQ 都在同一台服务器上运行。我想将它分发到多台服务器。

据我目前理解,我应该能够让我的 webapp 生成任务,将它们交给消息队列——它是它自己的服务器——然后工作人员分布在任意数量的服务器将使用该队列中的任务。我知道如何告诉我的 Django 应用程序哪个服务器是代理,但是如何在工作服务器上启动工作线程并指示他们从哪里消费任务?我完全迷路了——我什至不知道去哪里找。

【问题讨论】:

【参考方案1】:

您可以像这样运行您的工作代码 (async_tasks.py):

from celery import Celery
app = Celery('tasks', broker=broker_url)

@app.task(queue='queue_name')
def async_compute_something(input):
    # do something 
    return "Result"

在其他机器上使用此命令:

celery -A async_tasks worker -Q queue_name

请注意,您已正确设置代理的 url,而不是 localhost

【讨论】:

以上是关于如何使用 Celery 和 RabbitMQ 设置分布式工作池的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Celery 工作人员使用“外部”RabbitMQ 队列?

如何在 Django 和 Celery 中配置多个代理?

重试丢失或失败的任务(Celery、Django 和 RabbitMQ)

Celery+RabbitMQ+Redis

RabbitMQ 上的 Heroku、Django 和 celery

未执行的任务(Django + Heroku + Celery + RabbitMQ)