Celery 如何发现新节点?

Bru*_*uce 5 rabbitmq celery gunicorn docker

我在 Docker 中运行 Celery 和 RabbitMQ Gunicorn。

我的问题是:我知道 Celery 是为分布式处理而设计的。我根本没有看到任何文档,假设我在同一个 LAN 上有几台机器/节点,它们如何相互发现?RabbitMQ 有作用吗?celery 实例会以某种方式发现彼此吗?某处是否有合适的主机列表?如果是这样,我该如何编辑它?

另外,假设我将只使用一个节点来处理 HTTP 请求,我还需要在所有节点上运行 gunicorn 吗?我问这个是因为在 gunicorn start 命令中,它有一个工人数量的设置。而且,此设置是否仅适用于该节点,还是作为所有连接节点的最大总数?

编辑:在第一个答案之后,我开始研究这个。似乎我需要某种网络设置,swarm 或桥接等。我应该澄清一下,我正在使用 docker-compose 来提出解决方案,我发现正常的 swarm 设置不起作用,我有如果我走那条路,使用稍微不同的东西。

明确地说: 我需要一种方法,可以在不同的主机上添加 celery 工作人员,并使他们能够与“主”主机进行通信,以便我可以增加系统的容量。如果有人可以提供一个明确的流程来实现这一点或提供一个链接,那将是最有帮助的。

我希望我已经清楚地表达了这一点,如果您需要任何进一步的信息,请告诉我。

谢谢!

ffl*_*ing 2

据我所知,Celery 是为分布式处理而设计的。我根本没有看到任何文档,假设我在同一个 LAN 上有几台机器/节点,它们如何发现彼此?RabbitMQ有作用吗?celery 实例是否会以某种方式发现彼此?是否有合适的主机列表?如果是这样,我该如何编辑它?

Celery 是一个分布式任务队列,使用 RabbitMQ 等消息代理系统工作。

本质上发生的事情是所有 celery 工作线程连接一个共享队列,例如 RabbitMQ。主设备通过将工作推入队列来调度工作。也连接到队列的工作人员从队列中取出工作,然后尝试执行它。一旦完成(成功或失败),它将把结果推回队列,然后主设备可以查询。

鉴于这种架构,您不需要添加主机列表,它们会“自动检测”工作。您只需启动它们并确保它们可以与队列通信。

来自另一个 SO 答案的稍微更详细的解释。

用图表链接到架构

另外,假设我只使用一个节点来处理 HTTP 请求,我是否还需要在所有节点上运行 Gunicorn?我问这个是因为在gunicorn start命令中,它有一个worker数量的设置。并且,此设置仅适用于该节点,还是作为所有连接节点的最大总数?

不,您不需要在所有节点上运行 guicorn,只需在您用于通过 python 处理 HTTP 请求的节点上运行即可。芹菜工人不需要吉玉米果。guicorn中的worker设置是指HTTP监听池中的worker数量。这是独立的,独立的,与 celery 使用的工人集无关。