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). При более-менее частом обновлении данных серьезных проблем он не создает, в тоже время снижая количество запросов и трафик сервера. Выводы полезности такого подхода и графики латентности запросов описаны в этой статье.
Статья о comet на википедии
Comet Daily
November 9th, 2007 at 5:00 pm
Не понял технолгии. Как сервер помнит, кому отправлять данные, если по HTTP протоколу сервер забывает о клиенте, как только отправил ответ на запрос?
November 9th, 2007 at 5:31 pm
Соединение остается активным, не закрывается. Т.е. клиент запрашивает, а сервер шлет данные только тогда когда ему есть что сказать. Длительное соединение. Идею легко проследить если посмотреть через firebug запросы во втором примере.
November 9th, 2007 at 7:07 pm
Это жизненый подход при неболшом количестве одновременных пользователей. В противном случае расход ресурсов на сервере для поддержания соединений слишком расточительный.
Представьте, я открыл окно браузера и ушел спать. А соединение висит. Ресурсы сервера тратятся.
С моей точки зрения Аякс более эффективен.
А насчет трафика. Для поддержания отрытым соединения все равно посылаются постоянные пинги. ИМХО это не сильно отличается от периодических проверок обновлений клиентом.
November 9th, 2007 at 7:30 pm
Согласен, тут тоже многое зависит от того как сервер реализован, ну и от задачи конечно.
November 11th, 2007 at 7:40 pm
Мне кажется эта технология очень подошла бы для реализации в он-лайн игре, где происходит постоянный опрос сервера браузерами игроков, а постоянное соединение было бы выходом, если довести технологию до ума. Внес в закладки - почитаю на досуге об этом )
November 11th, 2007 at 8:09 pm
Кстати, упомянутая фирма Caplin Liberator требует отдельный нехилый сервер, что бы обрабатывать такое большое количество клиентов.
November 11th, 2007 at 9:20 pm
2NoNseNs: рад, что заинтересовало
2Simeon: вроде как у них его и купить можно (сервер)
November 11th, 2007 at 11:30 pm
[...] Рассказ о технологии comet с двумя практическими примерами by Jeka911. Статейка висела в браузере 2,5 дня, пока нашел время почитать. Как это все работает пока не очень понятно, нужно будет поизучать код примеров. Жень, хочу еще про технологии. [...]
March 4th, 2008 at 10:13 pm
Все описанные примеры это эмуляция настоящего 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/
March 26th, 2008 at 11:23 pm
Comet…
Óæå ïðèãîòîâèëèñü ìûòü ïîñóäó? ×òî æ, ïðèäåòñÿ Âàñ ðàçî÷àðîâàòü, ñåãîäíÿ ðå÷ü ïîéäåò âîâñå íå î ìîþùåì ñðåäñòâå, à îá îäíîèìåííîé òåõíîëîã…
March 27th, 2008 at 4:42 pm
Идея эта не нова и давно используется мной для построения чатов. Одновременное соединение более чем с 2000 пользователями и никакой нагрузки на сервер, сервер самописный.
March 27th, 2008 at 5:34 pm
Идея не нова, но как-бы сформулирована относительно недавно. Как ajax - тоже ведь очень долго исполняли подручными средствами, а только устандартили - и пошло движение массово.
То, что используешь - респект.
March 27th, 2008 at 6:56 pm
Vital, “Одновременное соединение более чем с 2000 пользователями” - не есть Comet. Вы уверены, что понимаете суть этой технологии?
March 27th, 2008 at 7:06 pm
Уверен абсолютно, ровно то, что здесь описывается используется очень давно
March 27th, 2008 at 7:32 pm
Мне кажется все же, что важен процесс выделения технологии как термина. Пусть это не несет ничего нового в плане знаний, но как “мини-письменность” для упрощенного понимания друг-друга при разговорах о сабже - это крайне полезно. Просто для дальнейшего развития технологии. Думаю, заслугу ребят из того же cometdaily недооценивать не стоит.
P.S. Я был зол, когда узнал что такое ajax и понял, что давно его использовал. Но само слово “ajax” - это уже магия
куда же от этого деться. Правда ведь?
September 2nd, 2008 at 11:38 am
Функция highlight_string() уже содержит внутри функционал по преобразованию html сущностей. Может конечно у вас тут в другом дело, но на всякий случай.