Эрланг: простой пубсуб для процессов - мой подход в порядке?

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

Мне нужен простой pubsub в Erlang/OTP, где процессы могли бы подписаться на какой-нибудь «концентратор» и получать копию сообщений, которые были отправлены на этот концентратор.

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

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

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

-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}.

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

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

-121--1309517- Как удалить запись из истории в ZSH Допустим, я выполнил команду, используя zsh echo «mysecret» > файл Я могу легко напечатать историю, включая 1 эхо «mysecret» > | файл Но как я могу...

Допустим, я выполнил команду, используя zsh

echo «mysecret» > file

Я могу легко напечатать историю, включая номера записей, используя команду fc -l :

 1 echo «mysecret» > | file

Но как легко удалить запись из истории?

Я не могу найти соответствующий абзац в man zshbuiltins .

73
задан sandoz 30 August 2011 в 14:03
поделиться