选择性地启动灵丹妙药应用程序

时间:2017-08-23 00:28:47

标签: elixir

如何控制伞状项目中的哪些应用程序,具体用例:

  1. 仅启动某些应用程序(如果它们尚未在群集中运行)(例如Singleton应用程序)
  2. 仅根据节点名称启动某些应用程序(例如某些应用程序可能使用具有IP地址限制的远程系统)
  3. 打开控制台时不要自动启动任何应用程序(例如iex -S mix)
  4. 由于

1 个答案:

答案 0 :(得分:5)

您可以使用OTP 分布式应用程序功能处理#1。您需要像这样配置kernel应用程序:

config :kernel, :distributed, [
  {:app1, 5_000, [:"node1@<x.x.x.x>", {:"node2@<x.x.x.y>", :"node3@<x.x.x.z>"}]},
  {:app2, [:"node2@<x.x.x.y>", {:"node1@<x.x.x.x>", :"node3@<x.x.x.z>"}]},
  ...
]

config :kernel,
  sync_nodes_mandatory: [:"node1@<x.x.x.x>", :"node2@<x.x.x.y>", ...],
  sync_nodes_timeout: 5_000

上述操作将确保在app1上启动node1,如果node1关闭或不可用,则会尝试其中一个备用节点node2node3(订单未定义)。它还需要在5秒内发生。同样,app2将在node2上启动,或者在其中一个备份失败,但它没有启动超时。

其他两个内核设置将要求在启动任何应用程序之前,列表中的所有节点都已连接,并且必须在5秒内发生,否则启动过程将失败。

根据群集中的要求,可以根据需要调整所有这些设置。它与自动确定要为其分配应用程序的节点并不完全相同,但它将确保它仅在一个节点上运行。

您可以在Erlang手册的Distributed Applications文档中了解更多相关信息。

上面也有点满足你对#2的要求,但它不是基于节点名称启动,而是你配置允许应用程序运行的节点的更多,它会这样做。您可以自己管理,使用included_applications,并根据当前节点名称或其他一些条件有条件地启动它们,但这将要求您启动那些包含的应用程序作为包含应用程序的主管树的一部分。根据您的保护伞的设置方式,这可能意味着您需要创建一个“shell”应用程序,该应用程序主要负责协调所包含应用程序的启动和配置。您可以阅读有关here

的更多信息