**Comet** е програмерска техника која му овозможува на опслужувачот да испраќа податоци до клиентот без клиентот претходно да упати барање за тоа. Оваа техника овозможува развој на event-driven семрежни прилози кои се извршуваат на страната на прелистувачот (на страната на клиентот).

Која е потребата за оваа техника
--------------------------------

Вообичаено, мрежното место се испраќа до клиентот само кога клиентот истата ќе ја побара. За секое барање на клиентот, прелистувачот иницира HTTP воспоставување на врска со опслужувачот, опслужувачот ги враќа бараните податоци после што врската се прекинува. Прикажаната страница ќе биде освежена само доколку корисникот експлицитно не побара тоа да биде направено, или пак премине на друга страница. Пренесувањето на целата страница може да одземе многу време, така што освежувањето може да предизвика одредена латенција.

За да се надмине овој проблем може да се користиме со AJAX технологијата, која овозможува да се освежат само одредени делови од мрежната страница. На овој начин се намалува количината на податоци која треба да се пренесе, а исто така се намалува и латенцијата. Од другата страна се намалува оптовареноста на опслужувачот и се зголемува неговата брзина на одговор. Со користење на асинхрон пренос на податоци во позадина, може да се зголеми уште повеќе брзината на веб-апликацијата.

Но и понатаму корисникот мора да упати барање до опслужувачот за одредени податоци. Проблемот станува уште поголем кај апликациите кои чекаат да се случи некој настан на страната на опслужувачот, пример доставување на одреден податок од некој друг корисник на апликацијата. Но времето на доставување на податокот не е познато.

Едно решение на овој проблем може да се бара во создавање на процес кој во одредени временски интервали би проверувал дали таков настан се случил на опслужувачот или не. Но ова не е елегантно решение бидејќи овој процес ќе го оптоварува опслужувачот, што директно ќе се отслика на брзината на веб-апликацијата. Уште повеќе непотребно ќе се зголеми сообраќајот по мрежата.

Подобро би било опслужувачот да испрати порака до клиентот во оној момент кога ќе се случи настанот, без клиентот да го праша за тоа. На овој начин клиентот не мора периодично да го проверува опслужувачот дали настанот се случил или не; ќе си продолжи да си работи други работи а работата на податоците кои зависат од настанот кој треба да се случи ќе биде извршена кога ќе се добие сигнал од опслужувачот. Ова е точно тоа што *Comet* има намера да го направи.

Технологија
-----------

За разлика од нормалниот пренос на податоци помеѓу опслужувачот и прелистувачот, врската со опслужувачот кога се користи *Comet* бара специјални конструкции. Апликацијата на клиентската страна мора да продолжи со работа додека воспоставува асинхрона врска со опслужувачот. На страната на опслужувачот, дури и ако барањето воопшто не е опслужено, врската не се прекинува (иако неискористена) сè додека не се случи соодветниот настан. Кога настанот ќе се случи, опслужувачот ги *гура* (анг. push) податоците кон клиентот, кои се генерирани како резултат на промената која настанала, преку веќе воспоставената врска.

Врската може да биде биде прекината после тоа, но може и да остане отворена и понатаму ако се очекуваат нови настани. Ако има повеќе промени, опслужувачот може да ги испрати податоците од промените преку воспоставената врска, без клиентот да прави експлицитен упит за нив до опслужувачот.

### Размерливост и доверливост

Постојат потенцијални опасности во зависност од тоа колку добро опслужувачот ја има иплементирано *Comet* технологијата. Бидејќи врската се чува отворена сè додека настанот не се случи, опслужувачот треба да се грижи за истата подолго време ако настанот не се случува така често. Проблемот станува поизразен ако различни врски чекаат на различни настани. Справувањето со голем број на врски може да доведе до проблеми на опслужувачот.

Огнените ѕидови (анг. Firewalls) и HTTP посредниците (анг. proxy) помеѓу прелистувачот и опслужувачот може да предизвикаат дополнителни проблеми. Огнените ѕидови вообичаено се нагодени да ја прекинат врската која е отворена подолго време.

Прелистувачите предизвикуваат дополнителни ограничувања: секција 8.1.4 на HTTP 1.1 спецификацијата вели дека "Еден клиент НЕ МОЖЕ да има повеќе од 2 врски со било кој опслужувач или посредник", а оваа препорака е почитувана од повеќето прелистувачи, вклучително и Internet Explorer и Firefox.

### Имплементации

Постојат неколку имплементации на Comet Ajax server-push моделот, комерцијални и некомерцијални:

* The SmartClient Messaging module (види AJAX IRC Chat пример) (англиски)
* Lightstreamer. Adaptive HTTP streaming with some AJAX APIs. (англиски)
* Steve and Jay McDonald’s \*Fjax Архивирано на 26 ноември 2006 г. (англиски)
* Pjax Архивирано на 7 декември 2006 г. (Push технологија за Ajax) (англиски)
* Server-Sent Events standards proposal specified by WHATWG (англиски)
* COMETd Scalable Open Source Comet Framework (англиски)

Поврзано
--------

* Ajax
* Message oriented middleware
* HTTP streaming
* Pushlet
* Push технологија

Наводи
------

1. ↑  секција 8.1.4 на HTTP 1.1 спецификацијата

Наводи
------

* Virgil's One™ [*мртва врска*] е COMET имплементација за продажба, големопродажба, приватни банки и брокери, целосно интегрирани со Websphere Portal заснован на Live™ од Virgil. (англиски)
* KnowNow - пионерска имплементација на *Comet* Архивирано на 1 ноември 2006 г. (англиски)
* Beyond AJAX: Забрзување на семрежните прилози со Real-Time Event предупредување, од Dr. Rohit Khare (pdf) Архивирано на 1 ноември 2006 г. (англиски)
* Divmod Athena: Comet имплементација во Python Архивирано на 2 јануари 2007 г. (англиски)
* DojoToolkit - Recent re-implementation Архивирано на 12 август 2008 г. (англиски)
* Changing the Web Paradigm: Streaming AJAX and Comet (pdf) (англиски)
* Push Technology for RIA: Two ways of introducing iPush Server to a RIA project Архивирано на 7 декември 2006 г. (англиски)

Надворешни врски
----------------

* Virgil's Live™ Архивирано на 7 декември 2006 г. пренос на било кој податок од било кој извор до било кој веб клиент и испорака на real-time податоци со мала латенција, висока доверливост, низ огнени ѕидови и прокси опслужувачи (англиски)
* Caplin Liberator Архивирано на 22 април 2007 г. Докажан, размерлив, двонасочен високооптимизиран опслужувач за пораки кој користи Comet со HTTP/S тунелирање, поддржува до 30,000 активни врски со мала латенција - се користи воглавно од поголеми финансиски инститции нз елиот свет. (англиски)
* Flex Enterprise Services Архивирано на 30 јуни 2007 г. An approach from Adobe/Macromedia for addressing the same problem using Flash. (англиски)
* Lightstreamer A full Comet solution that comprises a high-performance Push Server and a set of client libraries. The event-based architecture of the Server makes it able to scale to tens of thousands of concurrent connections. (англиски)
* ICE Technology Corp.'siPush Server Архивирано на 28 мај 2007 г. - real-time push data to your RIA. (англиски)
* Asteroid (a small Comet) Архивирано на 3 декември 2006 г.: Comet in Squeak(Smalltalk), by Diego Gomez Deck (англиски)
* Fjax Архивирано на 26 ноември 2006 г.: an open, lightweight, cross-browser methodology for Ajax-style development (англиски)
* COMETd: an open source scalable comet framework. A Dojo foundation sponsored project. (англиски)