Интервалы опроса сервера для клиента чата javascript - PullRequest
11 голосов
/ 24 марта 2009

Я создаю базовый небольшой чат / чат AJAX для своего веб-сайта, но я точно не знаю, как реализовать опрос сервера.

Вот основной поток программ, о котором я думаю:

  1. Пользователь заходит на страницу и показывает последние 10 сообщений
  2. Чтобы получать сообщения, отправленные другими, клиентский javascript запрашивает URL-адрес с параметром временной метки (равным значению последнего сообщения, полученного клиентом)
  3. Сервер возвращает все сообщения (не более 10) с этой отметки времени.

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

Должно ли это быть установленное ограничение по времени? например: каждые 10 секунд. Или это должно варьироваться в зависимости от использования? Например: проверка через 5 секунд. Если сообщений нет, не проверяйте еще 10 секунд. Если новых сообщений по-прежнему нет, проверьте в течение 15 секунд, затем 20, возможно, максимум раз в 30 секунд. Каждый раз, когда обнаруживается новое сообщение, обнуляйте таймер до 5 секунд и начинайте снова.

Я просто обеспокоен тем, что сервер может оказаться ненужным, учитывая, что в сети могут одновременно находиться сотни пользователей.

... или я все понял неправильно? Есть ли лучший способ реализовать простой чат javascript?

Ответы [ 6 ]

5 голосов
/ 24 марта 2009

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

Если ваш сервер может обрабатывать большое количество открытых соединений одновременно (например, он не использует весь поток или процесс для каждого соединения, например, nginx или erlang на основе сервера), вы можете использовать метод длинного опроса, при котором, как только получено одно сообщение, клиент немедленно запрашивает другое сообщение. Если доступных сообщений нет, сервер просто сохраняет соединение открытым, возможно, периодически отправляя фиктивные данные в качестве сообщения активности, пока сообщение не станет доступным.

4 голосов
/ 24 марта 2009

Комета, описанная Брайаном, является хорошей техникой, но требует поддержки сеансов на сервере, которая, вероятно, более продвинута, чем вы хотите реализовать для простого чата.

Лучший способ реализовать интервалы опроса - это представить, что у вас есть окно чата, которое вы можете свернуть, чтобы делать другие вещи, или открыть, чтобы увидеть, есть ли у вас новые сообщения. Когда вы находитесь в середине разговора, вы будете часто переключаться на него (опрос). Если вы какое-то время не получаете сообщений, вы будете выглядеть все реже и реже, пока не будете проверять его только изредка.

Предполагая, что вам не нужно вводить текст в режиме реального времени, вы, вероятно, можете опрашивать каждые 3 секунды или около того, когда на пике активности, и если ничего не появляется в течение 5-10 опросов, начните увеличивать интервал (возможно, удвоение это каждый раз), пока не достигнет 30-60 секунд. Возвращение сообщения должно сбросить интервал опроса до нескольких секунд, в то время как отправка сообщения должна производить мгновенный опрос, но, в противном случае, нет необходимости влиять на частоту опроса.

3 голосов
/ 24 марта 2009

Честно говоря, если вы реализуете " базовый маленький AJAX-чат / чат ", такие вещи, как Jabber , Comet и т. Д., Излишни. Эти вещи потребуют от вас дополнительных серверы / прокси для загрузки сервера приложений и базы данных.
Когда вы думаете о таких вещах, как управление присутствием («Джо печатает ...»), тогда все становится слишком сложным для вашего приложения (учитывая, что «чат» не является вашей главной целью).
Подумайте о добавлении виджетов от таких провайдеров, как Meebo и Userplane . Как только вы масштабируете, подумайте о Jabber и тому подобном ...

0 голосов
/ 18 апреля 2009

http://jabbify.com/home/comet_service Это бесплатный кометный чат, созданный парнями, которые работали с фреймворком jmvc. Еще не пробовал, но выглядит многообещающе.

0 голосов
/ 24 марта 2009

Это очень сложный вопрос, помните о злоупотреблениях. Злонамеренные пользователи будут бить вас как можно чаще, причем самая ранняя временная метка будет подделана, чтобы вызвать нагрузку на ваш сервер БД. Обязательно проверяйте эту временную метку или игнорируйте ее, потому что не должны ли все быть в одно и то же время в любом случае?

Вы можете отправить интервал опроса пользователю как функцию времени ответа другого пользователя. Это лучший вид динамики, я думаю.

0 голосов
/ 24 марта 2009

Вы должны проверить, печатает ли другой пользователь каждые 5 секунд или около того, если другой пользователь печатает, то вы можете проверять каждую 1 секунду, чтобы увидеть, отправил ли пользователь новое сообщение. Тем не менее, вы должны быть в состоянии проверять каждую 1 секунду, чтобы видеть, печатает ли другой пользователь, и если они тогда каждые 25-25 секунд проверяют, было ли отправлено новое сообщение. С широкополосным доступом, так общепринятым на инете, не должно быть проблемы. Перейти к более длительному тайм-ауту опроса для коммутируемого доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...