了解芹菜工作节点

Understanding celery worker nodes

我想在这里了解 celery 和 AMQP 的工作原理。

我的场景

我在我的机器上安装了celery

pip install celery

我做任务使用

from celery import Celery

app = Celery('tasks', backend='amqp', broker='amqp://')

@app.task
def print_hello():
    print 'hello there'

据我了解,celery 将此任务转换为消息并通过 AMQP 协议发送给代理(redis 或 rabbitmq)。然后将这些消息排队并传递给工作节点处理消息。

我的问题是,

  1. 假设我在 Java 环境中创建任务,如果消息发送到外部工作节点,是否意味着工作节点服务器必须安装 Java 才能执行任务?
  2. 如果消息被外部工作节点拾取,工作节点和代理如何找到对方?上面的代码中我只有broker地址来存放任务。

此外,为什么我们将任务存储在代理中?为什么我们不能在 celery 中实现交换算法并将消息直接发送给工人?

SOAP 和 AMQP 有什么区别?

工作人员不仅需要 Python,还需要 运行 执行任务的所有代码。

但是您没有专门针对节点,这正是存在代理的原因。你把你的任务放到队列里,工作人员来接他们。

我不知道你为什么在这个上下文中提到 SOAP。跟任何事情都没有关系。

您问题的具体答案是:

  1. "if the message is sent to a external worker node" 有点误导。消息本身不会发送到工作节点。它被发送到 Broker(由 URL 标识),特别是该 Broker 上的一个 Exchange,带有一个 Routing Key,它看到它在队列中登陆。 Worker 都配置了相同的 Broker URL 并读取此 Queue,这很像 [first-in-best-dressed][1] 的情况,第一个使用消息的 Worker(读取消息在 AMQP 中,它通过一个原子操作从队列中删除)。 [消息][2] 与语言无关。然而,Workers 是在 Python 中编写的,任务定义必须在 Python 中,尽管 Python 任务定义当然可以通过任何方式调用任何其他库来执行任务。但从某种意义上说,是的,无论你的任务需要什么 运行 时间库来 运行 它都需要与 Worker 在同一台机器上,并且它们必须有一个 Python 包装器这样 Worker 就可以加载它们了。

  2. "If the message is picked by external worker node, how does worker node and broker find each other?" - 这个问题具有误导性。他们找不到对方。 Worker 配置了与 Client 完全相同的 Broker URL。它已经知道了URL。 Celery 通常在 Python 中解决这个问题的方式是您共享的代码片段由客户端和 Worker 加载。这其实就是Celery的优点之一。您在 Python 中编写任务,并在 Worker 中不加更改地加载定义。因此,它们使用相同的 Broker,并定义相同的 Task。 @app.task 实际上创建了一个 Task class 实例,它有两个非常重要的方法:apply_async() 创建和发送请求任务的消息,以及 运行( ) 其中 运行 是装饰函数。前者称为 int Client。后者由 Worker 执行(实际上 运行 任务)。

  3. "Why are we storing the tasks in a broker?" - 任务不存储在代理中。该任务在 python 文件中定义,就像您的代码片段一样。如2中所述。Client和Worker都读取相同的定义。一条消息从 Client 发送到 Worker,要求它执行 运行 任务。

  4. "Why couldn't we implement exchange algorithm in celery and send the message direct to workers?" - 我不得不在这里猜测一下,但我会问,为什么要重新发明轮子?有一个定义的标准,AMQP(高级消息队列协议),并且有许多该标准的实现。为什么还要写一个? Celery 是 FOSS,和很多 FOSS 一样,我想开始编写它的人希望专注于任务管理而不是消息管理,并选择依靠 AMQP 进行消息管理。一个公平的选择。但值得一提的是,Celery 确实在 Kombu 中实现了很多,为 AMQP 提供 Python API。

SOAP(简单对象访问协议的缩写)是一种消息传递协议规范,用于在计算机网络中实现 Web 服务时交换结构化信息。

AMQP(Advanced Message Queuing Protocol的缩写)是面向消息中间件的开放标准应用层协议。 AMQP 的定义特征是消息导向、队列、路由(包括点对点和发布-订阅)、可靠性和安全性。

SOAP 通常在协议栈中处于更高级别。此处描述:

https://www.amqp.org/product/different