您可以使用 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宕机或不可用,它将尝试备份节点之一,node2或node3(顺序未定义)。它还要求这在 5 秒内发生。同样,app2 将在 node2 上启动,或者在其中一个备份上启动,但它没有启动超时。
其他两个内核设置要求在启动任何应用程序之前,列表中的所有节点都已连接,并且必须在 5 秒内完成,否则启动过程将失败。
所有这些设置都可以根据集群的需要进行调整。这与自动确定将应用程序分配到的节点并不完全相同,但它会确保它仅在 一个 节点上运行。
您可以在 Erlang 手册中的 Distributed Applications 文档中阅读更多相关信息。
以上内容在一定程度上也满足了您对#2 的要求,但它不是基于节点的名称来启动,更多的是您配置允许运行应用程序的节点,它会这样做。您可以通过使用included_applications 自己管理它,并根据当前节点名称或其他一些条件有条件地启动它们,但这将要求您将这些包含的应用程序作为包含应用程序的主管树的一部分启动。根据您的保护伞的设置方式,这可能意味着您需要创建一个“shell”应用程序,该应用程序主要负责协调所包含应用程序的启动和配置。你可以阅读更多关于那些here