我有一个包含多个EC2的设置,我在所有这些设备上运行celery
。我还有一个运行celerybeat
的方框。我可以让celerybeat
与剩余的celery
客户端上运行的任务一起运行。
有没有办法让必需的任务所有 celery
个实例必须运行?用例是清除日志,对盒子进行基本的健全性检查等。
我已阅读以下内容:
http://docs.celeryproject.org/en/latest/userguide/workers.html
答案 0 :(得分:0)
实际上,芹菜不像推式系统那样工作,而是像拉式系统一样。
您只需将一个任务放入队列,其中一个可用的工作人员就可以获得并执行。
根据您的问题,我假设在instances
下,您的意思是servers
芹菜的workers
正在运行。所以你想在所有服务器上运行相同的任务。
我认为您只能放置一些任务(对应于服务器编号)并为每个任务指定确切的路由编号(与工作人员的ID相同)。
mytask.apply_async(kwargs={'a': 1, 'b': 2}, routing_key='aaabbc-dddeeff-243453')
mytask.apply_async(kwargs={'a': 1, 'b': 2}, routing_key='bbbbbb-fffddd-dabcfe')
...
答案 1 :(得分:0)
Broadcast
Celery也可以支持广播路由。这是一个 示例交换broadcast_tasks,将任务副本传递给所有人 与之相关的工人:
来自kombu.common import Broadcast
CELERY_QUEUES =(广播('broadcast_tasks'),)
CELERY_ROUTES = {'tasks.reload_cache':{'queue':'broadcast_tasks'}} 现在,tasks.reload_cache任务将被发送给每个消费的工人 从这个队列。