Erlang应用程序需要多少个主管?

时间:2016-08-18 07:53:16

标签: nginx erlang supervisor

我想用微服务方法创建一个webapp。

它将包含一组作为Erlang应用程序的独立服务,我将能够单独启动和停止。在他们面前,将有nginx服务器作为反向代理。

我是否应该将所有这些服务放在一位上帝监督下,还是应该让他们分开担任主管?

根据我应该做出这个决定的事实?

3 个答案:

答案 0 :(得分:0)

通过使每个服务成为Erlang应用程序,您已经得到了答案:每个应用程序都有一个单独的监督树。

答案 1 :(得分:0)

在我看来,答案取决于独立运行应用程序的能力(或必要性)。

如果服务需要由于可能发生变化的接口而保持一致,那么拥有一个或有限数量的监督树(和应用程序)会更容易。服务的启动和停止是您的应用程序的界面。

如果您的服务是独立的,或者它们具有非常稳定的接口(例如使用标准),或者您不关心在运行中发布,那么每个服务的应用程序似乎是首选解决方案。

答案 2 :(得分:0)

主管有明确的目标:让您控制在出现错误时管理您的州的方式。

如果您有两个部分(A和B)的申请。每个都存储一些状态:SA和SB。您可以根据一个问题来决定如何构建监督树:如果没有国家的其他部分,这部分国家是否有意义?如果A重新启动且SA已清除但B未重新启动且SB未清除,我的应用程序是否可以继续正常工作?

在观察主管时,人们通常会考虑重启和重启速度。可以说,这是主管不太重要的一部分。你应该真正关心的是什么是开始的和以什么顺序。什么应该重新启动,以什么顺序?

主管提供三种重启策略。

  • one_for_one - 这假设受管儿童的状态是独立的。所有这些都是默认和最不实用的。
  • one_for_all - 如果其中一个孩子死亡,其他孩子的状态也必须被清除
  • rest_for_one - 左边的孩子不应该重启,右边的孩子应该重启。

我非常喜欢的其他概念是"error kernel"。如果rest_for_one,左边的孩子是你的“错误内核”。

你必须要知道的另一件重要的事情是,主管按照从左到右,深度优先的顺序启动所有孩子。并以相反的顺序停止它们。