Как распределить приложения по узлам, не запуская все приложения как часть распределенного рукопожатия

Фон

  • У меня есть приложение, которое запускается автоматически при запуске узла (используя.rel, .boot и т. Д.)
  • Я хочу, чтобы приложение переключалось на альтернативные узлы, если первый узел выходит из строя.
  • Я использую возможность распределенных приложений Erlang для обработки отказов и переходов.

проблема

Проблема заключается в том, что частью согласования распределенных приложений является то, что, когда узлы рукопожатие, чтобы определить, какой узел будет оставаться в рабочем состоянии, а какой будет приостановлен, приложение запускается на всех узлах. Мне нужно, чтобы приложение НЕ работало на нескольких узлах, если это возможно.

Вопрос

  • Есть ли способ, чтобы узлы автоматически запускали мое приложение, кроме случаев, когда они участвуют в согласовании запуска распределенных приложений? С другой стороны,
  • Как мне добиться, чтобы мое приложение запускалось без присмотра и при сбое, не требуя, чтобы мое приложение работало (даже кратко) на нескольких узлах

1 ответ

К сожалению, возможности перехода и переключения Erlang в настоящее время довольно ограничены, поэтому вам нужно, чтобы ваше приложение работало на всех узлах, чтобы эти возможности работали.

Единственная идея, которая приходит мне в голову, немного сумасшедшая и включает в себя еще один уровень косвенности, но на самом деле это может сработать.

Вы можете написать поддельное, легкое приложение- оболочку, которое затем запускаете на всех узлах. Это приложение использует стандартные возможности Erlang Distribution. Затем вы реализуете свои стратегии перехода / отработки отказа, просто запустив исходное приложение:

-module(wrapper).
-behaviour(application).

[...]

start({takeover, _Node}, _Args) ->
  application:start(original_app).

[...]

Кроме того, имейте в виду, что при вводе application:start(my_app) для распределенного приложения на всех ваших узлах приложение запускается не на всех узлах. Вы можете проверить это, набрав application:which_applications() на каждом из узлов. Вы заметите, как приложение работает на одном узле.

Наконец, могу я спросить, почему вы не можете запустить приложение более чем на одном узле?

Другие вопросы по тегам