Erlang: лучший способ для одноэлементного gen_server в кластере Erlang?

Параметр:

Я хочу запустить уникальный глобальный зарегистрированный процесс gen_server в кластере erlang. Если процесс остановлен или работающий узел выходит из строя, процесс должен быть запущен на одном из других узлов.

Процесс является частью супервизора. Проблема в том, что запустить супервизор на втором узле не удается, потому что gen_server уже запущен и зарегистрирован глобально с первого узла.

Вопрос (ы):

  • Можно ли проверять, зарегистрирован ли уже процесс глобально внутри gen_server start_link и в этом случае вернуть {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).


6
задан Rumpelstilz 16 December 2010 в 21:46
поделиться