首页 > 解决方案 > 如何在烧瓶应用程序中使用芹菜将任务从一台服务器发送到另一台服务器

问题描述

我有两个烧瓶应用程序,一个在服务器 A 上,另一个在服务器 B 上。我想要做的是在某些条件下从服务器 A 上的应用程序生成一个异步任务并将其发送到服务器 B 上的应用程序(即调用一个函数在服务器 B) 上。我认为芹菜发送任务方法将用于它但不知道如何使用它。

假设我在服务器 B 上的应用程序中有一个函数“func”

def func(x):
    return x

我想在服务器 A 上的应用程序中的另一个函数“somefunc”中调用“func”,如下所示:

def somefunc(x):
    if condition is True:
        func(x)   

我将如何使用 celery 来实现这个逻辑?请提前帮助和感谢

标签: pythonflaskcelery

解决方案


在服务 A 上,您将拥有:

from celery.execute import send_task


@app.route('/')
def endpoint():
    if cond(x):
        send_task(
           'task_service_b',
           (param1, param2),
           exchange='if u have a specific one',
           routing_key='a routing key'
        )

在服务 b 上,您需要让应用程序监听“路由键”并绑定到交换器“如果你有一个特定的”,

messaging_exchange = Exchange('if u have a specific one')
bindings = (
    binding(messaging_exchange, routing_key=routing_key)
    for routing_key in ['a routing key']
)

default_binding = binding(
    Exchange(celery_app.conf.task_default_queue),
    routing_key=celery_app.conf.task_default_queue
)

celery_app.conf.task_queues = [
    # default queue has same routing key as name of the queue
    Queue(celery_app.conf.task_default_queue, [default_binding]),
    Queue('service.b.queue', list(bindings))
]

否则你可以绕过所有,只send_task进入服务 b 队列。您将需要服务 b 上的芹菜工人,因为该任务需要由工人使用


推荐阅读