Erlang: простой пабsub для процессов - понятен ли мой подход?

Отказ от ответственности: я довольно новичок в Erlang и OTP.

Я хочу простой паб в Erlang/OTP, где процессы могли бы подписаться на какой-нибудь "хаб" и получать копии сообщений, которые были отправлены на этот хаб.

Я знаю о gen_event , но он обрабатывает события в одном процессе менеджера событий, в то время как я хочу, чтобы каждый подписчик был отдельным, автономным процессом. Также я не смог прогнать контроль обработчиков gen_event. К сожалению, в результатах Google было полно ссылок на XMPP (Ejabberd) и RabbitMQ, поэтому я не нашел ничего, имеющего отношение к моей идее.

Моя идея заключается в том, что такая модель pubsub бесшовно отображает дерево наблюдения. Так что я подумал расширить супервизор (gen_server под капотом), чтобы он мог посылать сообщения всем своим детям.

Я взломал это в своем быстром и грязном поведении "диспетчера":

-module(dispatcher).
-extends(supervisor).
-export([notify/2, start_link/2, start_link/3, handle_cast/2]).

start_link(Mod, Args) ->
    gen_server:start_link(dispatcher, {self, Mod, Args}, []).

start_link(SupName, Mod, Args) ->
    gen_server:start_link(SupName, dispatcher, {SupName, Mod, Args}, []).

notify(Dispatcher, Message) ->
    gen_server:cast(Dispatcher, {message, Message}).

handle_cast({message, Message}, State) ->
    {reply, Children, State} = supervisor:handle_call(which_children, dummy, State),
    Pids = lists:filter(fun(Pid) -> is_pid(Pid) end,
                 lists:map(fun({_Id, Child, _Type, _Modules}) -> Child end,
                           Children)),
    [gen_server:cast(Pid, Message) || Pid <- Pids],
    {noreply, State}.

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

Не мог бы кто-нибудь, пожалуйста, критиковать (или одобрить) мой подход, и/или порекомендовать какие-нибудь альтернативы?

9
задан Peer Stritzinger 30 August 2011 в 17:20
поделиться