如何在不在每个节点启动依赖项的情况下启动分布式 Erlang 应用程序?

How to start distributed Erlang app without starting dependencies at every node?

我尝试运行一个简单的应用程序以分布式方式测试故障转移接管功能但失败了。

我想要的:

该应用程序 myapp_api 有一个休息 api,它有 myapp 个应用程序作为依赖项。我想在 3 个节点上启动 myapp_api,我希望整个应用程序 (myapp_api + myapp) 同时仅在一个节点上工作。

哪里错了:

主应用程序 (myapp_api) 按预期工作:仅在一个节点上进行故障转移和接管。但由于某种原因,依赖 myapp 总是从每个节点开始。我希望它同时只在一个节点上工作。

我是做什么的:

我以第一个节点的配置为例

[
    {kernel,
    [{distributed, [{myapp_api,
        1000,
        ['n1@myhost', {'n2@myhost', 'n3@myhost'}]}]},
        {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
        {sync_nodes_timeout, 5000}
    ]}
].

我打电话 erl -sname nI -config nI.config -pa apps/*/ebin deps/*/ebin -s myapp_api 在每个节点。

现在这有点混乱,因为你说:

I want to start myapp_api on 3 nodes, I want the whole app (myapp_api + myapp) to be working only at one node at the same time.

然后您添加:

The main app (myapp_api) works as expected: only at one node with failover and takeover. But for some reason depended myapp always starts at every node.

在第一段中你说 myapp_api 应该 运行 无处不在,在第二个引用中你说它通过一次在一个节点上启动来按预期工作。

我在这里假设您希望整个设置成为故障转移,而不仅仅是顶级应用程序,我只是对第一段感到困惑。

您使用的配置文件显示了发生的情况:

[{kernel,
  [{distributed, [{myapp_api,
    1000,
    ['n1@myhost', {'n2@myhost', 'n3@myhost'}]}]},
    {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
    {sync_nodes_timeout, 5000}
]}].

重要的一点是 myapp_api 定义了节点 ['n1@myhost', {'n2@myhost', 'n3@myhost'}]。此顺序意味着它 运行 以最高优先级在 n1@myhost 上运行,然后在发生故障转移时以同等优先级在其他节点上运行。

问题是 none 的依赖项以相同的方式分布,因此可以预期到处都是 运行ning。

您只需扩展该配置文件即可使其正常工作。在这里,我完成了它并重新缩进以更好地显示其结构:

[{kernel,
  [{distributed, [
     {myapp_api, 1000, ['n1@myhost', {'n2@myhost', 'n3@myhost'}]},
     {myapp, 1000, ['n1@myhost', {'n2@myhost', 'n3@myhost'}]},
   ]},
   {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
   {sync_nodes_timeout, 5000}
]}].

我还没有直接测试过,但我很确定这会起作用。

如果你想要 myapp_api 无处不在,但 myapp 到 运行 在一个地方,你可以使用 global registration,给 myapp的public面向进程,获取myapp_api来调用这些。当以下配置支持时,myapp_api 将能够将流量路由到 myapp 所在的任何地方:

[{kernel,
  [{distributed, [
     {myapp, 1000, ['n1@myhost', {'n2@myhost', 'n3@myhost'}]},
   ]},
   {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
   {sync_nodes_timeout, 5000}
]}].

(看看 myapp 是如何获得分布配置文件的唯一应用程序?其他应用程序将在所有节点上达到 运行)