¿Cómo iniciar la aplicación Erlang distribuida sin iniciar dependencias en cada nodo?
distributed failover (1)
Traté de ejecutar una aplicación simple de forma distribuida para probar las funciones de recuperación de fallas pero fallé.
Lo que quiero:
La aplicación es myapp_api
con una API de descanso, tiene la aplicación myapp
como una dependencia. Quiero iniciar myapp_api
en 3 nodos, quiero que toda la aplicación ( myapp_api
+ myapp
) funcione solo en un nodo al mismo tiempo.
Qué está mal:
La aplicación principal ( myapp_api
) funciona como se esperaba: solo en un nodo con failover y takeover. Pero por alguna razón dependía que myapp
siempre comenzara en cada nodo. Quiero que funcione solo en un nodo al mismo tiempo.
Lo que hago:
Mi configuración para el primer nodo como ejemplo.
[
{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
en cada nodo.
Ahora esto se vuelve un poco confuso porque dices:
Quiero iniciar myapp_api en 3 nodos, quiero que toda la aplicación (myapp_api + myapp) funcione solo en un nodo al mismo tiempo.
y agregas:
La aplicación principal (myapp_api) funciona como se esperaba: solo en un nodo con failover y takeover. Pero por alguna razón dependía que myapp siempre comenzara en cada nodo.
En el primer párrafo dices que myapp_api
debería ejecutarse en todas partes, en la segunda cita dices que funciona según lo previsto arrancando en un nodo a la vez.
Asumiré aquí que quiere que toda la configuración sea una conmutación por error, no solo la aplicación de nivel superior y me confunde en el primer párrafo.
El archivo de configuración que usas muestra lo que sucede:
[{kernel,
[{distributed, [{myapp_api,
1000,
[''n1@myhost'', {''n2@myhost'', ''n3@myhost''}]}]},
{sync_nodes_optional, [''n2@myhost'', ''n3@myhost'']},
{sync_nodes_timeout, 5000}
]}].
Lo importante es que myapp_api
tiene myapp_api
los nodos [''n1@myhost'', {''n2@myhost'', ''n3@myhost''}]
. Esta orden significa que se ejecuta en n1@myhost
con la máxima prioridad, y luego en los otros nodos con la misma prioridad si hay una conmutación por error.
El problema es que ninguna de las dependencias se distribuye de la misma manera y, por lo tanto, se puede esperar que se ejecute en todas partes.
Solo deberías expandir ese archivo de configuración para que funcione. Aquí lo hice y lo reinventé para mostrar mejor su estructura:
[{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}
]}].
No lo he probado directamente, pero estoy bastante seguro de que esto funcionará.
Si lo que deseaba era que myapp_api
estuviera en todas partes excepto que myapp
ejecutara en un solo lugar, podría usar el registro global , darle un nombre al proceso público de myapp
, obtener myapp_api
para llamar a estos. myapp_api
luego podría enrutar el tráfico a cualquier lugar donde myapp
esté cuando sea compatible con la siguiente configuración:
[{kernel,
[{distributed, [
{myapp, 1000, [''n1@myhost'', {''n2@myhost'', ''n3@myhost''}]},
]},
{sync_nodes_optional, [''n2@myhost'', ''n3@myhost'']},
{sync_nodes_timeout, 5000}
]}].
(Vea cómo myapp
es la única aplicación que obtiene un perfil de distribución; otras aplicaciones se ejecutarán en todos los nodos)