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

Kru*_*rut 3 elixir

对于我的具体用例,如何控制伞项目中的哪些应用程序启动:

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

谢谢

bit*_*ker 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

您可以在" 分布式应用程序"文档的Erlang手册中阅读有关此内容的更多信息.

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