Jquery comet да и просто comet

Comet - это архитектура веб-приложений, в которой сервер посылает данные клиенту (обычно браузеру) асинхронно. При использовании comet клиент не должен периодически опрашивать сервер для проверки наличия обновлений. Таким образом экономится трафик и уменьшается нагрузка на сервер (не нужно выдавать клиенту пустые ответы о том, что обновлений нет). При классическом подходе для уменьшения нагрузки обычно увеличивают таймаут между опросами сервера, но тогда возникает другая проблема - клиент получает данные с задержкой. В архтектуре comet данные клиенту посылаются сразу, как только они обновились.

Теоретически, comet - это лишь идея, которая не подразумевает конкретных способов реализации. Я приведу примеры двух способов, которые взяты отсюда, но переписаны с prototype’а на jquery.

1. Скрытый iframe. (forever-frame)

Смысл: на странице создается невидимый iframe, в котором в бесконечном цикле выводятся методы обновляющие данные на странице.

Пример был взят элементарный: клиенту передается текущее время на сервере:

В iframe выводится:

while(1) {echo '<script type="text/javascript">';

echo 'comet.printServerTime('.time().');';

echo '</script>';

flush(); //шлем

sleep(1); //процессор отдыхает

}

Скачать пример

Естественно, при таком использовании в крупных проектах возникает немало проблем, одна из которых - огромное число открытых одновременно соединений. Популярные http серверы были написаны с расчетом на класическую архитектуру web (от которой ajax в плане нагрузки на сервер в общем-то не сильно отличается), потому в крупных comet проектах обычно используются другие серверы. Например Caplin Liberator, который работает с финансовыми приложениями и способен держать на соединении 10,000 пользователей, посылая им до 4,000,000 сообщений в секунду.

Другая проблема: фаерволы и прокси. Многие прокси буферизируют сообщения так, что они передаются клиенту тогда когда набирают определенный объем. Фаерволы часто настроены так, что обрывают слишком длительные соединения.

2. Jquery Comet. (long-polling)

Смысл: используются длительные запросы к серверу, клиенту информация выдается как только она обновится. При ошибке или после успешного запроса серверу посылается повторный.

while ($currentmodif <= $lastmodif) // check if the data file has been modified

{

sleep(1); //разгружаем процессор

clearstatcache();

$currentmodif = filemtime($filename);

}

send_data_to_client();

Пример - простенький чат (немного глючненький, простите), который общается с сервером по типу comet.

Такой вариант - более жизненный чем предыдущий (iframe). При более-менее частом обновлении данных серьезных проблем он не создает, в тоже время снижая количество запросов и трафик сервера. Выводы полезности такого подхода и графики латентности запросов описаны в этой статье.

Скачать 2й пример

Статья о comet на википедии
Comet Daily

О-о, а вот это?

Комментарии (16)

  1. Сашка

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

  2. jeka911

    Соединение остается активным, не закрывается. Т.е. клиент запрашивает, а сервер шлет данные только тогда когда ему есть что сказать. Длительное соединение. Идею легко проследить если посмотреть через firebug запросы во втором примере.

  3. simeon

    Это жизненый подход при неболшом количестве одновременных пользователей. В противном случае расход ресурсов на сервере для поддержания соединений слишком расточительный.
    Представьте, я открыл окно браузера и ушел спать. А соединение висит. Ресурсы сервера тратятся.
    С моей точки зрения Аякс более эффективен.

    А насчет трафика. Для поддержания отрытым соединения все равно посылаются постоянные пинги. ИМХО это не сильно отличается от периодических проверок обновлений клиентом.

  4. jeka911

    Согласен, тут тоже многое зависит от того как сервер реализован, ну и от задачи конечно.

  5. NoNseNs

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

  6. Simeon

    Кстати, упомянутая фирма Caplin Liberator требует отдельный нехилый сервер, что бы обрабатывать такое большое количество клиентов.

  7. jeka911

    2NoNseNs: рад, что заинтересовало

    2Simeon: вроде как у них его и купить можно (сервер)

  8. Блог FX’а » Архив блога » Одной строкой. Номер раз.

    [...] Рассказ о технологии comet с двумя практическими примерами by Jeka911. Статейка висела в браузере 2,5 дня, пока нашел время почитать. Как это все работает пока не очень понятно, нужно будет поизучать код примеров. Жень, хочу еще про технологии. [...]

  9. Алексей

    Все описанные примеры это эмуляция настоящего Comet или так называемый CometAJAX. Для полноценной реализации технологии необходимы дополнительные средства…кому интересно по сабжу линк http://blog.okitweb.ru/%d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d1%8f-comet-%d0%ba%d0%be%d0%bc%d0%b5%d1%82%d0%b0-%d1%83%d0%b6%d0%b5-%d0%bf%d1%80%d0%b8%d0%b1%d0%bb%d0%b8%d0%b6%d0%b0%d0%b5%d1%82%d1%81%d1%8f/

  10. Insight IT

    Comet…

    Óæå ïðèãîòîâèëèñü ìûòü ïîñóäó? ×òî æ, ïðèäåòñÿ Âàñ ðàçî÷àðîâàòü, ñåãîäíÿ ðå÷ü ïîéäåò âîâñå íå î ìîþùåì ñðåäñòâå, à îá îäíîèìåííîé òåõíîëîã…

  11. Vital

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

  12. jeka911

    Идея не нова, но как-бы сформулирована относительно недавно. Как ajax - тоже ведь очень долго исполняли подручными средствами, а только устандартили - и пошло движение массово.

    То, что используешь - респект.

  13. Алексей

    Vital, “Одновременное соединение более чем с 2000 пользователями” - не есть Comet. Вы уверены, что понимаете суть этой технологии?

  14. Vital

    Уверен абсолютно, ровно то, что здесь описывается используется очень давно

  15. jeka911

    Мне кажется все же, что важен процесс выделения технологии как термина. Пусть это не несет ничего нового в плане знаний, но как “мини-письменность” для упрощенного понимания друг-друга при разговорах о сабже - это крайне полезно. Просто для дальнейшего развития технологии. Думаю, заслугу ребят из того же cometdaily недооценивать не стоит.

    P.S. Я был зол, когда узнал что такое ajax и понял, что давно его использовал. Но само слово “ajax” - это уже магия :) куда же от этого деться. Правда ведь?

  16. lcf

    Функция highlight_string() уже содержит внутри функционал по преобразованию html сущностей. Может конечно у вас тут в другом дело, но на всякий случай.