Я должен сказать, что на меня произвела впечатление Поддержка Misultin для веб-сокетов (некоторые примеры здесь ).Мой JavaScript запускает запросы и получает ответы по сети с «незначительной» задержкой или задержкой, Отлично !!
Глядя на то, как выглядит цикл обработчика данных для WebSockets, он напоминает цикл обычных сокетов TCP / IP,По крайней мере, базовый способ в Erlang
% callback on received websockets data
handle_websocket(Ws) ->
receive
{browser, Data} ->
Ws:send(["received '", Data, "'"]),
handle_websocket(Ws);
_Ignore ->
handle_websocket(Ws)
after 5000 ->
Ws:send("pushing!"),
handle_websocket(Ws)
end.
Этот фрагмент кода выполняется в процессе, который порождается Misultin, функцией, которую вы даете ему при запуске сервера, как показано ниже:
start(Port)->
HTTPHandler = fun(Req) -> handle_http(Req, Port) end,
WebSocketHandler = fun(Ws) -> <b>handle_websocket(Ws)</b> end,
Options = [{port, Port},{loop, HTTPHandler},{ws_loop, WebSocketHandler}],
misultin:start_link(Options).
.Подробнее об этом читайте на странице примера.
У меня есть несколько вопросов.
Вопрос 1: Могу ли я изменить управляющий процесс веб-сокета, как мы обычно делаем сСокеты TCP / IP в Эрланге?(мы обычно используем:
gen_tcp:controlling_process(Socket,NewProcessId)
)
Вопрос 2: Является ли
Misultin единственной библиотекой Erlang / OTP HTTP, которая поддерживаетWebSockets?Где остальные?
РЕДАКТИРОВАТЬ: Теперь, причина, по которой мне нужно иметь возможность передавать элемент управления WebSocket от Misultin Подумайте о
gen_server
, который будет управлять пулом WebSocketsскажем, это игровой сервер.В текущем примере Misultin для каждого Соединения WebSocket существует управляющий процесс, другими словами, для каждого WebSocket будет создан процесс.Теперь я знаю, что Эрланг - герой с процессами, но я не хочу этого, я хочу, чтобы эти начальные процессы умерли, как только они перейдут к моему
gen_server
органу управления WebSocket.
Я бы хотел этого
gen_server
для переключения данных между этими WebSockets.В текущей реализации мне нужно отслеживать
Pid
процесса Misultin handle_websocket следующим образом:
%% Here is misultin's control process
%% I get its Pid and save it somewhere
%% and link it to my_gen_server so that
%% if it exits i know its gone
handle_websocket(Ws)->
process_flag(trap_exit,true),
Pid = self(),
link(my_gen_server),
save_connection(Pid),
wait_msgs(Ws).
wait_msgs(Ws)->
receive
{browser,Data}->
FromPid = self(),
send_to_gen_server(Data,FromPid),
handle_websocket(Ws);
{broadcast,Message} ->
%% i can broadcast to all connected WebSockets
Ws:send(Message),
handle_websocket(Ws);
_Ignore -> handle_websocket(Ws)
end.
Выше идея работает очень хорошо, благодаря чему я сохраняю весь процесс управления в Mnesia Ram Tableи посмотрите на соответствие заданным критериям, если приложение хочет отправить этому конкретному пользователю сообщение.Однако с тем, чего я хочу достичь, я понимаю, что в реальном мире процессов может быть так много, что мой сервер может дать сбой.Я хочу, чтобы по крайней мере один gen_server
управлял тысячами веб-сокетов, а не имел процесс для каждого веб-сокета, таким образом, я мог бы немного сэкономить память.
Предложение: Автор Misultinмог бы создать реализацию Web Socket Groups для нас в следующем выпуске, в результате чего у нас может быть группа WebSockets, управляемая тем же процессом.Это было бы похоже на Nitrogen's Comet Groups
, в котором кометные соединения группируются под одним и тем же управлением.Если это невозможно, нам понадобится сам контроль, предоставим API, где мы сможем взять под контроль эти веб-сокеты.
Что вы, инженеры, думаете об этом?
Что вы предлагаете и / или комментируете по этому поводу?
Автор Мисултина мог бы что-то сказать по этому поводу.Спасибо всем