【问题标题】:Configure Django/Celery to send tasks to different broker配置 Django/Celery 将任务发送到不同的代理
【发布时间】:2019-07-26 19:31:27
【问题描述】:

系统正在运行一个 Django 服务器 (1.11.5),其中 Celery (4.0.0) 和 RabbitMQ 作为代理。

有必要将一些任务发送到远程服务器以在那里进行处理。这个新服务器将安装自己的 RabbitMQ 以将其用作代理。问题出现在运行 Django 的服务器上,我们需要选择哪些任务继续在本地机器上运行,哪些任务被发送到新服务器。

由于某些架构原因,使用队列无法解决此问题,必须将任务发送到新代理。

是否可以在 Django 中创建两个不同的 Celery 应用程序(每个都指向不同的代理),每个应用程序都有自己的任务?怎么办?

【问题讨论】:

  • 你真的需要两个 RabbitMQ 实例吗?您可以在不同的服务器上拥有 celery 工作者,它们都与同一个 RabbitMQ 实例通信,因此您可以放弃现有的实例并将所有内容发送到新的实例......
  • 我们想避免这种解决方案,因为这意味着比预期更大的变化。在尝试了here 提出的解决方案(这也意味着很多改变)之后,我们决定改变我们组织 Celery 和 RabbitMQ 的方式,只使用一个具有不同队列的 RabbitMQ 实例。

标签: python django rabbitmq celery


【解决方案1】:

您可以创建两个 celery 应用并将 celery.py 重命名为 celery_app.py 以避免自动导入。

from celery import Celery

app1 = Celery('hello', broker='amqp://guest@localhost//')

@app1.task
def hello1():
    return 'hello world from local'

from celery import Celery

app2 = Celery('hello', broker='amqp://guest@remote//')

@app2.task
def hello2():
    return 'hello world from remote'

对于共享任务:

from celery import shared_task


@shared_task
def add(x, y):
    return x + y

当你运行你的 celery 工作节点时:

celery --app=PACKAGE.celery_app:app worker

【讨论】:

  • 即使我使用@app1.task() app.autodiscover_tasks() 在两个应用程序中都获取它们,我希望避免必须在应用程序中使用“include”参数添加每个任务()
  • 你可以避免自动发现。
猜你喜欢
  • 2018-11-12
  • 2011-05-18
  • 2018-12-20
  • 2017-03-12
  • 2016-12-25
  • 2019-04-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
相关资源
最近更新 更多