Python 了解芹菜工人节点

Python 了解芹菜工人节点,python,redis,rabbitmq,celery,Python,Redis,Rabbitmq,Celery,我试图了解芹菜和AMQP在这里的作用 我的情景 我在机器中安装芹菜 安装芹菜 我使用 from celery import Celery app = Celery('tasks', backend='amqp', broker='amqp://') @app.task def print_hello(): print 'hello there' 据我所知,芹菜将此任务转换为消息,并通过AMQP协议发送给代理(redis或rabbitmq)。然后将这些消息排队并传递到工作节点以处理该

我试图了解芹菜和AMQP在这里的作用

我的情景

我在机器中安装芹菜

安装芹菜

我使用

from celery import Celery

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

@app.task
def print_hello():
    print 'hello there'
据我所知,芹菜将此任务转换为消息,并通过AMQP协议发送给代理(redis或rabbitmq)。然后将这些消息排队并传递到工作节点以处理该消息

我的问题是,

  • 假设我在Java环境中创建了任务,如果消息被发送到外部工作节点,是否意味着工作节点服务器必须安装Java才能执行任务
  • 如果消息是由外部工作节点拾取的,那么工作节点和代理如何找到彼此?在上面的代码中,我只有用于存储任务的代理地址
  • 还有,为什么我们要将任务存储在代理中?为什么我们不能在芹菜中实现交换算法并将消息直接发送给工人


    SOAP和AMQP之间的区别是什么?

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

    但是您没有具体地处理节点,这正是为什么存在代理的原因。你把你的任务放在队列上,工人们把它们捡起来


    我不知道你为什么在这里提到SOAP。这与任何事情都无关。

    您的问题的具体答案如下:

  • “如果消息被发送到外部工作节点”有点误导。消息本身不会发送到工作节点。它被发送到代理(由URL标识),特别是该代理上的一个带有路由密钥的交换,该路由密钥可以看到它在队列中登录。Worker都配置了相同的代理URL并读取此队列,这非常类似于[first in best dressed][1],第一个使用消息的Worker(要在AMQP中读取消息,它将在一个原子操作中从队列中删除)。[信息][2]与语言无关。然而,worker是用Python编写的,任务定义必须是用Python编写的,尽管Python任务定义当然可以通过任何方式调用任何其他库来执行任务。但从某种意义上说,是的,任务运行所需的任何运行时库都需要与辅助程序在同一台机器上,并且它们周围必须有一个Python包装器,以便辅助程序可以加载它们

  • “如果消息是由外部工作节点拾取的,那么工作节点和代理如何找到彼此?”-这个问题具有误导性。他们找不到对方。Worker使用与客户端完全相同的代理URL进行配置。它已经知道了URL。芹菜在Python中通常解决这个问题的方法是,客户端和工作程序都加载您共享的代码片段。事实上,这是芹菜的魅力之一。您可以使用Python编写任务,并在Worker中加载定义。因此,它们使用相同的代理,并定义了相同的任务。@app.task实际上创建了一个任务类实例,它有两个非常重要的方法:apply_async()创建并发送请求任务的消息,run()运行修饰函数。前者称为inthe客户端。后者由工作人员执行(以实际运行任务)

  • “为什么要将任务存储在代理中?”-任务不存储在代理中。该任务是在python文件中定义的,就像您的代码片段一样。如图2所述。客户机和工作机都可以读取相同的定义。一条消息从客户机发送到工作者,要求其运行任务

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

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

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

    SOAP在协议栈中的级别通常要高得多。此处描述:


    谢谢。那么,我的应用程序在哪里创建任务(应用程序服务器),芹菜和工人也在哪里?我们不能有几个外部工作节点?不,不一定。工作者可以在应用程序服务器上,也可以是(许多)外部机器。正如我所说的,重要的是它有它需要运行的任务的代码。如果我在本地机器上创建了任务并将其发送到外部代理(test.redis.cache:6357)。现在,此消息存储在代理中。假设我有一个外部节点工作者,这个节点如何知道我的代理(test.redis.cahe:6357)来获取任务?当你在工作者上启动芹菜时,你用代理的地址来配置它,这样它就可以连接了。