如何使用 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 队列?
重试丢失或失败的任务(Celery、Django 和 RabbitMQ)