【问题标题】:Is it possible to use a single celery instance to connect to multiple brokers?是否可以使用单个 celery 实例连接到多个代理?
【发布时间】:2015-09-18 15:49:07
【问题描述】:

我有一个用例,我想连接两个 RabbitMQ,RabbitMQ 实例 A 和实例 B。假设我不能将这两个实例组合成一个 RabbitMQ 实例,它们必须 分开。请注意,这两个实例具有不同的交换/队列,并且无论如何都不是数据或消息的复制。

是否可以使用单个 celery 应用程序连接到两个代理,以及它们的交换/队列:amqp://<instance-a>:5672amqp://<instance-b>:5672

我查看了文档,这似乎是不可能的,celery 在大多数情况下似乎是单片的——但是我对 celery(和 Python)相对较新,所以我可能错过了一些东西。

【问题讨论】:

  • 您希望 Celery 使用两个代理执行其任务管理?我之所以问,是因为我很确定您可以让 Celery 使用一个代理进行任务管理,并让任务使用第二个代理来实现某些其他目的。
  • @Louis 我想我只需要 Celery 来针对其中一个代理执行任务管理,但我仍然需要使用消息并从第二个连接对它们进行操作。我在想这意味着使用 Celery 对两者进行任务管理。拆分基本上是一个我几乎无法控制的外部消息队列和一个内部消息队列,我希望我可以围绕两个连接构建一个应用程序。最初我在想我可能需要进入多处理/多线程,但如果没有必要,我不想走那条路。

标签: python python-2.7 rabbitmq celery


【解决方案1】:

我怀疑您可能将芹菜“滥用”为rabbitmq 消费者。使用 rabbitmq 作为消息队列(或事件队列)是一个好主意,但你不需要使用 celery 来消费它(坦率地说 - 因为 celery 不适合这种工作,它可能会咬你以后开)

所以你最好选择一些 rabbiqmq 客户端抽象库(KombuPikaPuke 是主要的 python 选项)并让自己成为一个体面的消费者。

您也可以尝试将shovel plugin 用于rabbitmq。这可用于将消息从一个队列/交换“铲”到另一个。可能也有用

【讨论】:

  • 感谢您的洞察力!我已经开始怀疑这是一个非常正确的说法,但请允许我问这个问题:假设我专门将 celery 用于一个队列中与任务相关的工作流,并且仍然需要从另一个队列中消费,它是否更有意义生成两个独立的应用程序或以多进程/多线程的方式处理工作负载?
  • 我认为分离应用程序应该是基于“域边界”和“有界上下文”的决定。它真的是一个应用程序。然后将其保留为一个应用程序 - 您还可以运行一个应用程序,其中多个进程运行相同的代码库(例如,一个 django 应用程序,它也有一个从 rabbitmq 消费并调用 django 应用程序中的各种处理程序的进程)。如果不同的业务逻辑分开(走微服务路径),你可以使用rabbitmq来通信数据、事件和命令
  • 谢谢,感谢您抽出宝贵的时间。如果您不介意,最后一个问题/请求:是否有任何搜索词/主题/资源您可以指出我讨论从同一代码库运行一个具有多个进程的应用程序的概念?我假设这只是多处理/多线程,但如果它是不同的东西,知道要寻找什么会很有帮助!
  • 其实多处理/多线程有点不同。但是您可以考虑通常的 Django 应用程序:您将有一个 wsgi Web 服务器运行 Web 进程 - 并且可能会产生多个进程,每个进程具有多个线程(我认为默认的 uwsgi 服务器配置是 4 个进程)。我们通常还会有至少一个 celery worker 节点——同样,每个 worker 都是一个独立的进程,运行相同的代码库和不同的入口点。所以你实际上已经遇到过这个......只要应用程序状态不是“正在处理”或“内存中”你就很好
  • 谢谢!我会调查的!
猜你喜欢
  • 2020-12-27
  • 2017-04-09
  • 2016-05-10
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
相关资源
最近更新 更多