了解芹菜工人节点

时间:2017-05-19 16:51:53

标签: python redis rabbitmq celery

我想在这里了解芹菜和AMQP的工作情况。

我的情景

我在我的机器上安装芹菜

  

pip install celery

我使用

制作任务
from celery import Celery

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

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

据我所知,芹菜将此任务转换为消息并通过AMQP协议发送给经纪人(redis或rabbitmq)。然后将这些消息排队并传递给工作节点以处理消息。

我的问题是,

  1. 假设我在Java环境中创建了任务,如果将消息发送到外部工作节点,是否意味着工作节点服务器必须安装Java来执行任务?
  2. 如果外部工作线程节点选择了该消息,则工作节点和代理如何找到对方?在上面的代码中,我只有代理地址来存储任务。
  3. 另外,为什么我们将任务存储在经纪人中?为什么我们不能在芹菜中实施交换算法并将消息直接发送给工人?

    SOAP和AMQP有什么区别?

2 个答案:

答案 0 :(得分:1)

工作人员不仅需要Python,还需要您想要在其上运行的任务的所有代码。

但是你没有专门针对节点,这正是为什么有一个经纪人。你把你的任务放在队列上,然后工人们把它们拿起来。

我不知道为什么你在这个上下文中提到过SOAP。它与任何事情无关。

答案 1 :(得分:0)

您问题的具体答案是:

  1. “如果消息已发送到外部工作程序节点”,则会产生误导。消息本身不会发送到工作程序节点。它被发送到代理(由URL标识),特别是发送到该代理上具有路由密钥的Exchange,该路由密钥可以看到该代理落在队列中。所有工作人员都配置有相同的Broker URL并读取此队列,这在很多情况下都是[first-in-best-dressed] [1],这是第一个使用消息(在AMQP中读取消息的工作人员)在一原子操作中从队列中删除)。 [messages] [2]与语言无关。但是,Workers是用Python编写的,并且任务定义必须使用Python,尽管Python任务定义当然可以通过任何方式调用任何其他库来执行任务。但是从某种意义上说是的,无论您的任务需要什么运行时库才能运行,它都必须与Worker在同一台计算机上,并且它们周围必须有Python包装程序,以便Worker可以加载它们。

    < / li>
  2. “如果消息是由外部工作程序节点选择的,那么工作程序节点和代理如何找到彼此?” -这个问题是误导的。他们找不到彼此。使用与客户端完全相同的代理URL配置工作服务器。它知道URL。 Celery通常在Python中解决此问题的方式是,您共享的代码段同时由客户端和工作程序加载。实际上,这是芹菜的美丽之一。您使用Python编写了任务,并且未更改地将定义加载到Worker中。因此,他们使用相同的代理,并定义了相同的任务。 @ app.task实际上创建了一个Task类实例,该实例具有两个非常重要的方法:apply_async()用于创建并发送请求任务的消息,run()用于运行修饰后的函数。前者称为客户。后者由工作人员(实际运行任务)。

  3. “我们为什么将任务存储在代理中?” -任务未存储在代理中。该任务是在python文件(如您的代码段)中定义的。如2中所述。Client和Worker都读取相同的定义。消息从客户端发送到工作程序,要求其运行任务。

  4. “为什么我们不能在芹菜中实现交换算法并将消息直接发送给工人?” -我必须在这里猜测,但我会问,为什么要重新发明轮子?有一个定义的标准,AMQP(高级消息队列协议),并且该标准有许多实现。为什么还要写另一个? Celery是FOSS,和许多FOSS一样,我想象开始编写它的人希望专注于任务管理而不是消息管理,并选择依靠AMQP进行消息管理。一个公平的选择。但值得的是,Celery在Kombu中实现了很多,可以为AMQP提供Python API。

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

AMQP(高级消息队列协议的缩写)是面向消息的中间件的开放标准应用程序层协议。 AMQP的定义特征是消息定向,排队,路由(包括点对点以及发布和订阅),可靠性和安全性。

SOAP通常是协议栈中更高层次的。在这里描述:

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