Интервал опроса сервера для чата клиента javascript

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

Здесь основной поток программы, о котором я думаю:

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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