【问题标题】:How does Celery discover new Nodes?Celery 如何发现新节点?
【发布时间】:2017-02-03 19:40:54
【问题描述】:

我在 Docker 中运行 Celery 和 RabbitMQ Gunicorn。

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

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

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

明确一点:我需要一种方法,可以在不同的主机上添加 celery worker 并让他们能够与“主”主机通信,这样我就可以增加系统。如果有人可以提供实现此目标的清晰流程或链接,那将是最有帮助的。

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

谢谢!

【问题讨论】:

    标签: docker rabbitmq celery gunicorn


    【解决方案1】:

    我觉得@ffledgling 没有完全回答这个问题,所以我添加了一条注释:

    以下是工作人员发送给代理(在您的情况下为 RabbitMq)的所有事件的列表:http://docs.celeryproject.org/en/latest/userguide/monitoring.html#event-reference

    如您所见,工人自身相关的消息/事件很少:

    • 工人在线
    • 工人心跳
    • 工作人员离线

    它们都包含主机名的签名。因此,一个成功的握手流程(不完全是握手,因为 master 没有响应消息,而是在这里使用它作为一个隐喻)可能看起来像这样:

    > new worker online --> worker 向队列发送 worker-online 消息 --> master 收到并开始从 worker host 读取日志 --> master 调度任务 --> ...

    除此之外,主机名是每个事件中的标准正文字段(任务和工作人员自相关),这里是文档:http://docs.celeryproject.org/en/latest/internals/protocol.html?highlight=event%20reference#standard-body-fields

    例如,如果您查看task-started event:它还包含一个主机名作为签名,这就是主人如何知道谁拿起了任务以及从哪里读取任务日志的方式。

    【讨论】:

      【解决方案2】:

      我了解 Celery 是为分布式处理而设计的。什么 我根本没有看到任何文档,假设我有几个 同一局域网上的机器/节点,它们如何发现彼此?做 RabbitMQ 有什么作用?芹菜实例会以某种方式发现彼此吗? 某处是否有合适的主机列表?如果是这样,我该如何编辑它?

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

      所有 celery 工作人员连接一个共享队列(如 RabbitMQ)基本上会发生什么。 master(s) 通过将工作推入队列来调度工作。连接到队列的工作人员也将工作从队列中拉出,然后尝试执行它。一旦完成(成功或失败),它会将结果推回队列,然后主服务器可以查询。

      鉴于此架构,您无需添加主机列表,它们会“自动检测”工作。您只需启动它们并确保它们可以与队列对话。

      另一个 SO 答案的更详细的解释。

      Link to the architecture with a diagram.

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

      不,您不需要在所有节点上运行 guicorn,只需要您用于通过 python 提供 HTTP 请求的那个。芹菜工人不需要 guicorn。 guicorn 中的 worker 设置是指 HTTP 侦听器池中的 worker 数量。这是独立的、独立的,与 celery 使用的一组工人无关。

      【讨论】:

      • 嗨@ffledgling,感谢您的回答,我现在知道的比以前多得多。不过,我有几个澄清问题。您所说的:“您不需要添加主机列表,它们会“自动检测”工作。您只需启动它们并确保它们可以与队列对话。”我该怎么做呢?这是我原帖的基本精髓。我假设我在某个地方告诉 celery 实例,哪个文件?我需要遵循特定的格式吗?我确实检查了您发布的链接,它提供了丰富的信息,但没有给出实际的配置示例。再次感谢!
      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2017-05-08
      相关资源
      最近更新 更多