Технологии опроса в реальном времени - PullRequest
4 голосов
/ 04 января 2012

Сейчас я смотрю новостную ленту / тикер Facebook и мне интересно, какую технологию / архитектуру она использует для асинхронной загрузки данных, когда какое-либо из моих соединений обновляется.Одна возможность, о которой я могу подумать, - это JavaScript setInterval для функции, которая активно опрашивает сервер на наличие новых данных.

Интересно, насколько это эффективно.

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

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

Ответы [ 3 ]

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

Есть несколько технологий для достижения этой цели:

  • опрос: приложение каждые x миллисекунд отправляет запрос на проверку обновлений
  • длительный опрос: приложение отправляет запрос на сервер, но сервер отвечает только тогда, когда у него появляются новые данные (обычно, если новые данные недоступны в течение X секунд, отправляется пустой ответ или соединение разрывается)
  • навсегда фрейм: на странице открывается скрытый iframe, и делается запрос для документа, основанного на чанкованной кодировке HTTP 1.1
  • Потоковая передача XHR: позволяет отправлять последовательные сообщения с сервера без необходимости нового HTTP-запроса после каждого ответа
  • WebSockets: это лучший вариант, он поддерживает постоянную связь
  • Flash WebSockets: если WS изначально не поддерживается браузером, вы можете включить Flash-скрипт для расширения этой функциональности

Обычно люди используют Flash WebSockets или длинные опросы, когда WebSockets (наиболее эффективный транспорт) недоступен в браузере.

Прекрасный пример того, как объединить множество транспортных методов и абстрагировать их, - Socket.IO .

Дополнительные ресурсы:

http://en.wikipedia.org/wiki/Push_technology
http://en.wikipedia.org/wiki/Comet_(programming))
http://www.leggetter.co.uk/2011/08/25/what-came-before-websockets.html
Опрос сервера с помощью JavaScript
Есть ли разница между длинным опросом и использованием Comet
http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery
Видео, обсуждающее различные техники: http://vimeo.com/27771528

Книга Даже более быстрые сайты имеет полную главу (гл. 8), посвященную «Масштабированию с помощью кометы».

0 голосов
/ 04 января 2012

Возможно, вы можете взглянуть на Голиафа (неблокирующий сервер ввода-вывода, написанный на Ruby): http://postrank -labs.github.com / goliath /

0 голосов
/ 04 января 2012

Я могу ошибаться, но я думаю, что Facebook использует технику "длинных опросов", которая сохраняет http-соединение открытым для сервера в течение фиксированного времени. Данные, отправленные с сервера, запускают клиентскую часть события, которая обрабатывается в это время. Я полагаю, что они используют эту технику для поддержки старых браузеров, которые не имеют встроенной поддержки веб-сокетов.

Лично я работал над приложением со схожими требованиями и решил использовать комбинацию node.js и socket.io. Модуль socket.io использует разнообразные решения для опроса и автоматически выбирает лучшее, основываясь на том, что доступно на клиенте.

...