es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para conectar los nodos después de usar rebar3 shell, puedes utilizar el módulo net_kernel en Erlang para conectar los nodos. Puedes agregar el siguiente código en tu aplicación para conectar los nodos:

    % Conectarse al nodo principal
    net_kernel:connect('a@AdrianB-LAPTOP').
    % Conectarse al nodo de respaldo
    net_kernel:connect('b@Adrian-LAPTOP').
    

    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 con net_kernel. El módulo global 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 de gen_server de forma global:

    % Iniciar el gen_server solo en el nodo principal
    {ok, MainNode} = net_kernel:connect_node('a@AdrianB-LAPTOP'),
    case global:whereis_name(server) of
        undefined ->
            gen_server:start_link({global, server}, ?MODULE, [], []),
            ok = global:register_name(server, self());
        _ ->
            ok
    end.
    

    Con este código, el proceso gen_server solo se iniciará en el nodo principal y se registrará de forma global como server. Si el nodo principal falla, el nodo de respaldo puede conectarse a él y tomar el control del proceso server llamando a global:whereis_name/1 y global:register_name/2. De esta manera, el nodo de respaldo se convertirá automáticamente en el nodo principal tras la falla del nodo principal.

Comments are closed.