我想要的是:
该应用程序是带有rest api的myapp_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上运行,然后在具有相同优先级的其他节点上运行(如果存在故障转移).
问题是没有任何依赖项以相同的方式分布,因此可以预期它们将在任何地方运行.
您只需要扩展该配置文件即可使其工作.在这里,我完成了它并重新缩进以更好地显示其结构:
[{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的面向公众的进程命名,让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是唯一获得分发配置文件的应用程序?其他应用程序将在所有节点上运行)