Celery子任务在不同的远程机器上

时间:2016-02-25 09:49:52

标签: python rabbitmq celery

我有两台芹菜工人正在运行的服务器。我们称之为R1和R2。

从我的其他服务器(比如R3),我想创建链式任务,以便创建 R1.task任务,然后创建 R2.task子任务

但我很怀疑这是否可行。我试过了

# celery_apps.py on R3
from celery import Celery

from application.config import get_application_config

__author__ = 'hussain'

config = get_application_config()

celery_app_r1 = Celery(
    'R1',
    broker=config.CELERY_BROKER_URL_R1
)

celery_app_r2 = Celery(
    'R2',
    broker=config.CELERY_BROKER_URL_R2
)

celery_app_r1.conf.update(
    CELERY_TASK_SERIALIZER='json',
    CELERY_RESULT_SERIALIZER='json',
    CELERY_ACKS_LATE='True',
    CELERY_ACCEPT_CONTENT=['json']
)

celery_app_r2.conf.update(
    CELERY_TASK_SERIALIZER='json',
    CELERY_RESULT_SERIALIZER='json',
    CELERY_ACKS_LATE='True',
    CELERY_ACCEPT_CONTENT=['json']
)

这就是我尝试创建链式任务的方式

# client.py on R3
from celery import subtask
celery_app_r1.send_task(
    'communication.tasks.send_push_notification',
    (json.dumps(payload), ),
    exchange=config.CELERY_COMMUNICATION_EXCHANGE,
    routing_key=config.CELERY_PN_ROUTING_KEY,
    link=subtask(
        'application.tasks.save_pn_response',
        (device.id, ),
        exchange=config.CELERY_RECRUITMENT_EXCHANGE,
        routing_key=config.CELERY_CALLBACKS_ROUTING_KEY
    )
)

我甚至无法提及celery_app_r2。

如何在不同的远程计算机上运行此类子任务?

1 个答案:

答案 0 :(得分:2)

您不需要2个应用,2个经纪人或2个交易所。代理是用于通信的机器之间的共享链接等。

您需要的是2个队列,每个服务器一个,并使用diffirent routing_keys或直接执行队列名称相应地路由您的任务。

简单示例:

CELERY_QUEUES = (
    Queue('notifications'),
    Queue('callbacks')
)

然后在每个服务器中启动一个工作人员:

celery worker --app app -Q notifications --loglevel info
celery worker --app app -Q callbacks --loglevel info

并从通知中发送回调任务:

@app.task(queue='notifications')
def notification_task(*args, **kwargs):
    # ... whatever your notification logic is
    callback.s(arg1, arg2).delay()

@app.task(queue='callbacks')
def callback(*args, **kwargs)
    # ...

注意我没有使用send_task,而是直接导入该功能。除非您从具有不同代码库的服务器调用任务,否则不需要send_task。即如果您的项目增长并希望分离存储库等。