将芹菜与不同豆荚中的多个工人一起使用



我要做的就是将芹菜与kubernetes一起使用。我将Redis用作其他POD中的消息经纪人,并且每个队列的芹菜都有多个POD。

想象一下,如果我有3个队列,我将有3个不同的POD(即工人)可以接受和处理请求。

到目前为止,一切都很好,但是我的问题是,如果我克隆一个排队的豆荚,将有两个豆荚的豆荚,一个单一队列会怎样?

我认为客户端(即django)使用redis创建了一条新消息来发送给工人并启动工作,但是我不清楚会发生什么,因为我有两个豆荚听同一队列?第一个POD是否接受请求并启动工作并防止其他POD接受请求?

(我试图在芹菜的文档上进行一些搜索,以查看我是否可以找到任何线索,但不能。这就是为什么我要问这个问题)

我猜您正在使用基本任务类型,该任务类型采用"直接'队列类型,而不是'fanout'或'topic'队列,后两个有很大的差异,不会讨论在这里。

在使用REDIS作为经纪运输时,芹菜/kombu使用redis list对象作为队列的存储(源),请使用命令LPUSH发布消息,BRPOP来消耗消息。

简而言之,当没有从给定列表中弹出元素时,BRPOP(DOC)会阻止连接,如果列表不是空的,则从给定列表的尾部弹出元素。可以确保此操作是原子,没有两个连接可以获得相同的元素。

芹菜利用此功能来保证 ateal-once 消息传递。确认的使用不会影响此保证。

在您的情况下,有多个芹菜工人在多个POD中都有多个芹菜工人,但是它们都连接到同一redis服务器,所有这些都被阻止了同一键,请尝试从同一列表对象弹出一个元素。当新消息到达时,将有一个和只有一个工人可以收到该消息。


直到工人确认该消息之前,任务消息不会从队列中删除。工人可以提前保留许多消息,即使工人因电力故障或其他原因被杀害,该消息将被重新发送给另一名工人。

更多:http://docs.celeryproject.org/en/latest/userguide/tasks.html

两名工人(POD)将接收任务并独立完成任务。就像有一个吊舱,但以速度的两倍处理处理任务。

最新更新