gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:30:05 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

总之,BRPOP ( doc ) 在给定列表中没有要弹出的元素时阻塞连接,如果列表不为空,则从给定列表的尾部弹出一个元素。保证this operation is atomic ,没有两个连接可以获得相同的元素。

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

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

关于kubernetes - 将 Celery 与不同 Pod 中的多个 worker 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46403507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com