WebSockets в связи с сокетами TCP / IP в HTTP-библиотеке Misultin Erlang - PullRequest
1 голос
/ 10 января 2012

Я должен сказать, что на меня произвела впечатление Поддержка 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, где мы сможем взять под контроль эти веб-сокеты.

Что вы, инженеры, думаете об этом?
Что вы предлагаете и / или комментируете по этому поводу?

Автор Мисултина мог бы что-то сказать по этому поводу.Спасибо всем

Ответы [ 3 ]

4 голосов
/ 12 января 2012

(один) Разработчик Cowboy здесь.

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

Тест, проведенный ранее в прошлом году для полумиллиона подключений к веб-сокетам на одном сервере, привел к неправильному использованию 20 ГБ памяти,ковбой использует 16,2 ГБ или 14,3 ГБ, в зависимости от того, были ли процессы веб-сокета в спящем режиме или нет.Вы можете предположить, что все реализации веб-сокетов на erlang очень близки к этим числам.

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

Я готов поспорить, что гораздо дешевле учитывать это при покупке серверов, чем разрабатывать и решать проблемы в приложении, в котором вы работаете.не имеет соотношения 1: 1 между задачами / ресурсами и процессами.

https://twitter.com/#!/nivertech/status/114460039674212352

2 голосов
/ 11 января 2012

Автор Мисултина здесь.

Я настоятельно отговариваю вас от изменения процесса управления, потому что это сломает все внутренности Мисултина.Как и предлагал Стив, YAWS и Cowboy поддерживают WebSockets, и есть реализации, выполненные через Mochiweb , но я не знаю, активно ли они поддерживаются.

Вы обсуждаете проблемы памяти, ноЯ думаю, что вы смешиваете понятия.Я не могу понять, почему вам нужно все «централизованно» контролировать с помощью gen_server: ваше предположение о том, что «многие процессы могут привести к сбою вашей виртуальной машины», на самом деле неверно, Erlang построен на модели актера, и это имеет много преимуществ:

  • производительность из-за многоядерного использования, которого нет, если вы используете один gen_server
  • , способный использовать философию 'let it crash': в настоящее время похоже, что сбой вашего gen_server приведет к отключению всех доступных игр
  • ...

Erlang может обрабатывать сотни тысяч процессов на одной виртуальной машине, и у вас не будет доступных файловых дескрипторов для открытых сокетов, прежде чем это произойдет.

Итак, я бы посоветовал вам рассмотреть вопрос об использовании игровой логики в отдельных процессах Websocket и использовать передачу сообщений, чтобы заставить их взаимодействовать.Вы можете рассмотреть порождение «игровых процессов», которые, например, содержат информацию об участниках и статусе одной игры.В конце концов, gen_server, который отслеживает доступные игры - и делает только , что (в конечном итоге, имея таблицу ETS).Я бы, наверное, хотел бы пойти именно так, со всей структурой соответствующих руководителей.

Очевидно, я не уверен, чего вы пытаетесь достичь, поэтому я просто предполагаю, что здесь.Но если ваше беспокойство связано с памятью - ну, как сказал TRIAL AND ERROR EXP здесь ниже: не преждевременно оптимизируйте что-либо, особенно если вы планируете использовать Erlang таким образом, который может фактически ограничить его в том, что он способенof.

My $ 0,02.

2 голосов
/ 10 января 2012

Не уверен насчет вопроса 1, но относительно вопроса 2, Зевки и Ковбой также поддерживают WebSockets.

...