Descargo de responsabilidad: Soy bastante nuevo en Erlang y OTP.Erlang: pubsub simple para procesos: ¿está bien mi enfoque?
Quiero un pubsub simple en Erlang/OTP, donde los procesos pueden suscribirse en algún "concentrador" y recibir una copia de los mensajes que se enviaron a ese concentrador.
Conozco gen_event
, pero procesa eventos en un solo proceso de administrador de eventos, mientras que quiero que cada suscriptor sea un proceso independiente y autónomo. Además, no pude asimilar la supervisión de los controladores de gen_event
. Lamentablemente, los resultados de Google estaban llenos de enlaces XMPP (Ejabberd) y RabbitMQ, por lo que no encontré nada relevante para mi idea.
Mi idea es que el modelo de pubsub se corresponda perfectamente con el árbol de supervisión. Así que pensé en extender el supervisor (un gen_server
debajo del capó) para poder enviar un mensaje de reparto a todos sus hijos.
He hackeado esto en mi costumbre comportamiento "despachador" rápido y sucio-:
-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}.
Sin embargo, mientras todo parece funcionar bien en la primera vista (los niños reciben mensajes y se reinician cuando la perfección fallan), me pregunto siempre que fue una buena idea.
¿Alguien podría, por favor, criticar (o aprobar) mi enfoque, y/o recomendar algunas alternativas?
Son los mensajes almacenados y los nuevos procesos que se suscriben obtienen todo el historial de ellos. ¿O es que los mensajes se transmiten solo desde el momento en que se suscribe un proceso? –
Este último; como en Redis o 0MQ Pub/Sub. Echaré un vistazo a 'gen_event', gracias. – drdaeman