Celery如何发现新的节点?

时间:2017-02-03 19:40:55

标签: docker rabbitmq celery gunicorn

我在Docker中运行Celery和RabbitMQ Gunicorn。

我的问题是:我知道Celery是专为分布式处理而设计的。我所看到的根本就没有文档,假设我在同一局域网上有多台机器/节点,他们如何相互发现? RabbitMQ是否起作用?芹菜实例以某种方式发现彼此吗?某处有合适的主机列表吗?如果是,我该如何编辑呢?

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

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

要明确:我需要一种方法,我可以在不同的主机上添加芹菜工作者,让他们能够与" main"主机使我可以增加系统的容量。如果有人能够提供明确的流程来实现这一目标或链接,那么它将是最有帮助的。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

  

据我所知,Celery专为分布式处理而设计。什么   我认为根本没有文档,假设我有几个   同一局域网上的机器/节点,他们如何相互发现?是否   RabbitMQ发挥作用?芹菜实例以某种方式发现彼此吗?   某处有合适的主机列表吗?如果是,我该如何编辑呢?

Celery是一个分布式任务队列,可以使用诸如RabbitMQ之类的消息代理系统。

所有芹菜工作者基本上都会连接一个共享队列,例如RabbitMQ。主人通过将其推入队列来调度工作。连接到队列的工作人员也会从队列中取出工作然后尝试执行它。一旦完成(成功或其他),它会将结果推回到队列,然后主人可以查询。

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

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

Link to the architecture with a diagram

  

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

不,你不需要在所有节点上运行guicorn,只需要你通过python使用来运行HTTP请求的节点。芹菜工人不需要guicorn。 guicorn中的worker设置指的是HTTP侦听器池中的worker数。这与芹菜使用的一组工人是分开的,独立的和不相关的。

答案 1 :(得分:2)

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

以下是工作人员向经纪人发送的所有事件的列表(在您的案例中为RabbitMq):http://docs.celeryproject.org/en/latest/userguide/monitoring.html#event-reference

正如您所看到的,很少有工人与自我相关的消息/事件:

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

所有这些都包含主机名的签名。因此,一个成功的握手流程(不完全握手,因为master不响应消息但在此处将其用作隐喻)可能如下所示:

  

>   新工人在线 - >工作人员将工作人员在线消息发送到队列 - >主人收到并开始从工作人员主机读取日志 - >主计划任务 - > ...

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

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