Celery && RabbitMQ如何发布要交换的消息?

时间:2018-07-24 04:05:14

标签: rabbitmq celery

现在,我想将register事件发布到某个特殊的交易所,我可以使用celery对其进行远程检索和处理。

实际上,我已经使用send_task函数来实现这一点,但是它必须传递task_name来指示应执行并使用哪个任务。因此,对于我的目标而言似乎并不完美。

我想要的是什么

  1. register消息发布到某些Exchange
  2. 远程机器1 订阅此topicroute_key并捕获消息,用于执行任务;
  3. 远程计算机2 -与计算机1相同,但是执行另一个任务-收到该消息(可能需要回复某些queue

例如,就像这个工作流程:

注册:

  • 发送电子邮件
  • generate_info

    ......

1 个答案:

答案 0 :(得分:0)

这是我需要非标准交换时要做的事情。

在我的celeryconfig中,我指定该交换并为此分配队列(在我的情况下,我需要fanout交换):

from kombu.common import Broadcast
from kombu import Exchange, Queue
CELERY_QUEUES = (
   Broadcast(name='queue_name', exchange=Exchange('queue_name', type='fanout')),
)

然后我用celery multi生成工作器,并将其分配给我的特定队列,如下所示:

celery multi start 1 -A my_project -Q:1 queue_name -c:1 1 (other options go here)

然后我可以像这样将我的任务插入该队列:

from my_project import my_fancy_task
my_fancy_task.apply_async(args=(x, y, z), queue="my_queue")

我不太了解您的特定用例,如果您需要一台主机上的工作人员使用一个队列中的任务,然后又需要另一台主机上的工作人员使用另一队列中的任务,那么只需将您的任务分成两个队列并配置每个主机开始工作并将他们分配到您认为合适的队列中。也许这会有所帮助:Topic exchange ambiguity with RabbitMQ