Вопрос новичка Erlang/Mochiweb об общении с клиентами

Каждый раз, когда клиент/браузер подключается к серверу Mochiweb, он создает новый процесс Loop, не так ли? Итак, если я хочу передать сообщение от одного клиента другому (типичная система чата), я должен использовать self() цикла для хранения PID всех подключенных клиентов, не так ли?

Если что-то (или все) до сих пор не так, пожалуйста, объясните мне вкратце, как работает система, где серверный процесс и где клиентский процесс?

Как отправить сообщение процессу Loop клиента, используя его PID? Я имею в виду, где поставить «получить» в цикле?


person moriesta    schedule 19.07.2011    source источник


Ответы (3)


Вот хорошая статья о реализации веб-чата Mochiweb. HTTP-клиенты не имеют PID, поскольку HTTP является протоколом без сохранения состояния. Вы можете использовать файлы cookie, чтобы связать запрос с уникальным посетителем чата.

person Ward Bekker    schedule 19.07.2011

Во-первых, сделайте свое исследование правильно. Ознакомьтесь с этой статьей и этот, а затем последний.

Позвольте процессам mochiweb передавать данные чата на другой ваш сервер приложений (это может быть gen_server, рабочий процесс в вашем приложении OTP со многими руководителями, другие распределенные рабочие процессы и т. д.). Вы не должны зависеть от PID процесса mochiweb. Используйте другой способ уникальной идентификации ваших пользователей. Файлы cookie, идентификаторы сеансов, токены аутентификации и т. д. Что-то, управляемое только вашим приложением. Пусть процессы mochiweb просто доставят данные чата на ваши серверы, как только они станут доступны. Вы могли бы сделать какую-то очередь в mnesia, где у каждого пользователя есть очередь сообщений, в которую другие пользователи отправляют сообщения чата. Затем процессы mochiweb просто продолжают спрашивать mnesia, доступно ли сообщение для пользователя при каждом соединении. Таким образом, это будет зависеть от методологии чата: HTTP Long polling/COMET, REST/Server push/Keep-alive соединения blur blur blur.... Просто держите его отказоустойчивым и не задействуйте процессы mochiweb в движке чата, просто пусть mochiweb будет только транспортом, и пусть ваши джунгли чата будут позади него!

person Muzaaya Joshua    schedule 20.07.2011
comment
Спасибо за понятное и простое объяснение языка %) Я видел эти статьи, но дело в том, что я еще не начал изучать библиотеки OTP, я только начинаю. У меня есть один вопрос относительно вашего ответа: насколько я понимаю, mochiweb должен заботиться только о доставке сообщения клиенту-получателю, верно? И отдельный сервер должен заботиться о передаче сообщения нужному процессу mochiweb среди многих других процессов mochiweb (столько же, сколько подключенных клиентов), верно? Итак, как сервер должен доставлять сообщения конкретному mochiweb, не зная PID процедуры mochiweb? - person moriesta; 21.07.2011

Вы можете использовать несколько структур данных, чтобы избежать использования PID для идентификации. Возьмем пример очереди(). Представьте, что у вас есть реплицированная база данных mnesia с таблицей RAM, в которой вы реализовали однозначно идентифицируемую очередь () для каждого пользователя. Процесс (процесс mochiweb), удерживающий соединение с пользователем, хранит только идентификатор этого сеанса пользователя. Затем он использует это удостоверение, чтобы через регулярные промежутки времени проверять свою очередь() в Mnesia (если вы намерены делать это таким образом — поддерживая процессы mochiweb в течение всего сеанса пользователя). Тогда это означает, что независимо от того, через какой PID процесса подключен пользователь, пока процесс имеет идентификатор пользователя, он может извлекать (читать) сообщения из своей очереди сообщений (). Следовательно, это может привести к тому, что у пользователя будет несколько клиентских сеансов. Тот же процесс может использовать этот идентификатор для сброса сообщений от этого пользователя в очереди других пользователей().

person Muzaaya Joshua    schedule 07.08.2011