将 Celery 与不同 Pod 中的多个 worker 一起使用

Afs*_*ani 3 celery kubernetes

我想要做的是将 Celery 与 Kubernetes 一起使用。我在不同的 pod 中使用 Redis 作为消息代理,并且每个 Celery 队列都有多个 pod。

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

到目前为止一切正常,但我的问题是,如果我克隆其中一个队列的 pod 以将两个 pod 用于一个队列,会发生什么?

我认为客户端(即 Django)使用 Redis 创建了一条新消息以发送给工作人员并开始工作,但我不清楚会发生什么,因为我有两个 pod 正在侦听同一个队列?第一个 Pod 是否接受请求并启动作业并阻止另一个 Pod 接受请求?

(我试图在 Celery 的文档上搜索一下,看看我是否能找到任何线索,但我找不到。这就是我问这个问题的原因)

geo*_*xsh 5

我猜你使用的是基本任务类型,它采用“直接”队列类型,而不是“扇出”或“主题”队列,后两者有很大区别,这里不再讨论。

在使用 Redis 作为代理传输时,celery/kombu 使用 Redislist 对象作为队列()的存储,使用命令LPUSH发布消息,BRPOP消费消息。

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

Celery 利用此功能来保证至少一次消息传递。使用确认不会影响此保证。

在您的情况下,多个 pod 中有多个 celery 工作人员,但所有这些工作人员都连接到同一个 Redis 服务器,所有这些工作人员都因同一个键而被阻止,尝试从同一个列表对象中弹出一个元素。当新消息到达时,将只有一个工人可以收到该消息。