Я хочу запустить уникальный глобальный зарегистрированный процесс gen_server в кластере erlang. Если процесс остановлен или работающий узел выходит из строя, процесс должен быть запущен на одном из других узлов.
Процесс является частью супервизора. Проблема в том, что запустить супервизор на втором узле не удается, потому что gen_server уже запущен и зарегистрирован глобально с первого узла.
{ok, Pid}
уже запущенного процесса вместо запуска нового экземпляра gen_server?
global: trans ()
внутри функции start_link gen_server?
start_link() ->
global:trans({?MODULE, ?MODULE}, fun() ->
case gen_server:start_link({global, ?MODULE}, ?MODULE, [], []) of
{ok, Pid} ->
{ok, Pid};
{error, {already_started, Pid}} ->
link(Pid),
{ok, Pid};
Else -> Else
end
end).