我想在这里了解芹菜和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)。然后将这些消息排队并传递给工作节点以处理消息。
我的问题是,
另外,为什么我们将任务存储在经纪人中?为什么我们不能在芹菜中实施交换算法并将消息直接发送给工人?
SOAP和AMQP有什么区别?
答案 0 :(得分:1)
工作人员不仅需要Python,还需要您想要在其上运行的任务的所有代码。
但是你没有专门针对节点,这正是为什么有一个经纪人。你把你的任务放在队列上,然后工人们把它们拿起来。
我不知道为什么你在这个上下文中提到过SOAP。它与任何事情无关。
答案 1 :(得分:0)
您问题的具体答案是:
“如果消息已发送到外部工作程序节点”,则会产生误导。消息本身不会发送到工作程序节点。它被发送到代理(由URL标识),特别是发送到该代理上具有路由密钥的Exchange,该路由密钥可以看到该代理落在队列中。所有工作人员都配置有相同的Broker URL并读取此队列,这在很多情况下都是[first-in-best-dressed] [1],这是第一个使用消息(在AMQP中读取消息的工作人员)在一原子操作中从队列中删除)。 [messages] [2]与语言无关。但是,Workers是用Python编写的,并且任务定义必须使用Python,尽管Python任务定义当然可以通过任何方式调用任何其他库来执行任务。但是从某种意义上说是的,无论您的任务需要什么运行时库才能运行,它都必须与Worker在同一台计算机上,并且它们周围必须有Python包装程序,以便Worker可以加载它们。
< / li>“如果消息是由外部工作程序节点选择的,那么工作程序节点和代理如何找到彼此?” -这个问题是误导的。他们找不到彼此。使用与客户端完全相同的代理URL配置工作服务器。它知道URL。 Celery通常在Python中解决此问题的方式是,您共享的代码段同时由客户端和工作程序加载。实际上,这是芹菜的美丽之一。您使用Python编写了任务,并且未更改地将定义加载到Worker中。因此,他们使用相同的代理,并定义了相同的任务。 @ app.task实际上创建了一个Task类实例,该实例具有两个非常重要的方法:apply_async()用于创建并发送请求任务的消息,run()用于运行修饰后的函数。前者称为客户。后者由工作人员(实际运行任务)。
“我们为什么将任务存储在代理中?” -任务未存储在代理中。该任务是在python文件(如您的代码段)中定义的。如2中所述。Client和Worker都读取相同的定义。消息从客户端发送到工作程序,要求其运行任务。
“为什么我们不能在芹菜中实现交换算法并将消息直接发送给工人?” -我必须在这里猜测,但我会问,为什么要重新发明轮子?有一个定义的标准,AMQP(高级消息队列协议),并且该标准有许多实现。为什么还要写另一个? Celery是FOSS,和许多FOSS一样,我想象开始编写它的人希望专注于任务管理而不是消息管理,并选择依靠AMQP进行消息管理。一个公平的选择。但值得的是,Celery在Kombu中实现了很多,可以为AMQP提供Python API。
AMQP(高级消息队列协议的缩写)是面向消息的中间件的开放标准应用程序层协议。 AMQP的定义特征是消息定向,排队,路由(包括点对点以及发布和订阅),可靠性和安全性。
SOAP通常是协议栈中更高层次的。在这里描述: