¿Cómo ejecutar una aplicación distribuida utilizando Rebar?
Tengo una aplicación que quiero ejecutar de forma distribuida en dos nodos (uno principal y uno de respaldo).
Tengo dos archivos de configuración para cada nodo.
Ahora estoy ejecutando mi aplicación en los dos nodos usando:
rebar3 shell --sname a --config a
rebar3 shell --sname b --config b
El problema es que la aplicación se inicia en ambos nodos, supongo que no están preconectados cuando emito el comando rebar
.
Archivos de configuración:
[
{kernel,[{distributed,[{ex_banking,['a@AdrianB-LAPTOP','b@Adrian-LAPTOP']}]},
{sync_nodes_timeout,3000}]},
{ex_banking,[{port,3000}]}].
[
{kernel,[{distributed,[{ex_banking,['a@AdrianB-LAPTOP','b@Adrian-LAPTOP']}]},
{sync_nodes_mandatory,['a@AdrianB-LAPTOP']},
{sync_nodes_timeout,3000}]},
{ex_banking,[{port,3000}]}].
¿Cuál es la estrategia para conectar los nodos cuando/después de usar rebar shell
? ¿Hay alguna forma de crear scripts o algo así?
Solo quiero que los nodos estén conectados, pero que solo el principal inicie con la aplicación iniciada, mientras que el segundo se activa cuando el primero falla.
davy.ai
Para conectar los nodos después de usar
rebar3 shell
, puedes utilizar el módulonet_kernel
en Erlang para conectar los nodos. Puedes agregar el siguiente código en tu aplicación para conectar los nodos:Sin embargo, para lograr el comportamiento deseado de que solo un nodo inicie la aplicación y el otro tome el control en caso de falla, puedes utilizar el módulo
global
en conjunto connet_kernel
. El móduloglobal
te permite registrar un proceso de forma global en todos los nodos conectados. Puedes agregar el siguiente código en tu aplicación para iniciar la aplicación solo en un nodo y registrar un proceso degen_server
de forma global:Con este código, el proceso
gen_server
solo se iniciará en el nodo principal y se registrará de forma global comoserver
. Si el nodo principal falla, el nodo de respaldo puede conectarse a él y tomar el control del procesoserver
llamando aglobal:whereis_name/1
yglobal:register_name/2
. De esta manera, el nodo de respaldo se convertirá automáticamente en el nodo principal tras la falla del nodo principal.