면책 조항 : 저는 Erlang과 OTP를 처음 보았습니다.Erlang : 프로세스 용 간단한 pubsub - 내 접근 방식은 괜찮습니까?
Erlang/OTP에서는 프로세스가 일부 "허브"에 가입하고 해당 허브로 전송 된 메시지의 사본을받을 수있는 간단한 pubsub가 필요합니다.
저는 약 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}.
그러나, 모든 것이 첫 눈에 잘 작동하는 것 같다 동안 (아이 메시지를 수신하고 원활하게 때 다시 시작 그들은 실패한다), 이것이 좋은 아이디어 일 때마다 나는 궁금하다.
내 접근 방식을 비판하거나 승인하거나 다른 대안을 권유 할 수 있습니까?
메시지를 저장하고 새 프로세스를 구독하는 경우 해당 메시지의 전체 내역을 가져옵니다. 아니면 메시지가 프로세스가 가입 한 시점에서만 전달되는 것입니까? –
후자; Redis 또는 0MQ Pub/Sub와 같습니다. 덕분에'gen_event'에 대해 다시 한번 살펴 보겠습니다. – drdaeman