Что я должен использовать для определения местоположения в Эрланге? - PullRequest
2 голосов
/ 22 июля 2011

Я пишу свое первое распределенное приложение на erlang и замечаю, что мне нужно знать узел, на котором у меня запущен «сервис».Как я могу отправлять запросы на мой сервис, не зная, на каком узле он работает?

В основном я хочу сделать что-то вроде этого:

ReferenceToTheServiceProcess = locate(my_service).
ReferenceToTheServiceProcess ! {request, Stuff}.

Или что-то еще с эквивалентным эффектом (слабая связь).

Спасибо!

Ответы [ 3 ]

8 голосов
/ 22 июля 2011

Вы можете зарегистрировать свой сервисный процесс с глобальным именем, например, используя gproc. Таким образом, вам не нужно знать, на каком узле в данный момент находится ваша служба, и ваш ресурс мог бы выглядеть так, как вы хотели.

3 голосов
/ 22 июля 2011

Вы можете зарегистрировать процесс с помощью модуля global . Из вашего сервисного процесса позвоните:

global:register_name(my_service, self()).

Чтобы отправить сообщение глобально зарегистрированному вызову процесса:

Pid = global:whereis_name(my_service),
Pid ! {request, Stuff}.

или звоните:

global:send(my_service, {request, Stuff}).

Функциональность регистрации является атомарной. Если процесс обслуживания завершается или узел отключается, имя будет глобально незарегистрировано.

0 голосов
/ 23 июля 2011

Или, если вы все еще хотите локальную регистрацию процесса, вы можете написать что-то вроде:

 where_is_service(Service) ->
     lists:filter(fun(X) -> X =/= undefined end, [rpc:call(Node, erlang, whereis, [Service]) || Node <- [node() | nodes()]]).

Эта функция будет возвращать в результате pid процессов, называемых локально (на узлах) как Service

После этого, если вы хотите запустить только первый процесс, используйте список, возвращаемый функцией:

send_msg_to_service(Service,Message) ->
     case where_is_service(Service) of
        [APid | _] -> APid ! Message, ok;
        []         -> {error, service_not_running}
     end.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...