[英]How to start distributed Erlang app without starting dependencies at every node?
我嘗試以分布式方式運行一個簡單的應用程序來測試故障轉移接管功能但是失敗了。
我想要的是:
該應用程序是帶有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
。
現在這有點令人困惑,因為你說:
我想在3個節點上啟動myapp_api,我希望整個應用程序(myapp_api + myapp)只能同時在一個節點上運行。
並添加:
主應用程序(myapp_api)按預期工作:僅在具有故障轉移和接管的一個節點上運行。 但由於某些原因,依賴myapp總是從每個節點開始。
在第一段中,您說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
可以在一個地方運行,你可以使用全局注冊 ,為myapp
的面向公眾的進程myapp_api
,讓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
是唯一獲得分發配置文件的應用程序?其他應用程序將在所有節點上運行)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.