Параметр:
Я хочу запустить уникальный глобальный зарегистрированный процесс gen_server в кластере erlang. Если процесс остановлен или узел, на котором он запущен, выходит из строя, процесс должен быть запущен на одном из других узлов.
Процесс является частью супервайзера. Проблема в том, что запустить супервизор на втором узле не удается, потому что gen_server уже запущен и зарегистрирован глобально на первом узле.
Вопросы):
- Можно ли проверить, зарегистрирован ли процесс уже глобально внутри функции start_link gen_server, и в этом случае вернуть
{ok, Pid}
уже запущенного процесса вместо запуска нового экземпляра gen_server? - Верно ли, что таким образом один процесс будет частью нескольких супервизоров, и если один процесс выйдет из строя, все супервизоры на всех других узлах попытаются перезапустить процесс. Первый супервизор создаст новый процесс 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).