Kometa přináší web v reálném čase

Real-time web (nebo též česky „web v reálném čase“) je podle odhadů analytiků „buzzwordem zítřka“. Budete se s ním setkávat čím dál víc, jak se postupy R-T webu budou stávat běžnějšími. Pojďme se podívat na jednu technologii, která je s realtime webem často spojována, a která stála např. za Google Wave.

Implementace realtime technik v současném webu naráží na problém, a to že současný web je projektován jednosměrně, tedy že „klient táhne“. Bohužel pro opravdový „web v reálném čase“ potřebujeme i to, aby měl server možnost poslat zprávu klientovi tehdy, když nastane nějaká událost hodná pozornosti.

Real-time web

Web v reálném čase je, podle definice, souhrnem metod, technik a postupů, které slouží k tomu, aby se informace dostala k příjemci v ten okamžik, kdy ji autor vydá, a to bez toho, aby musel příjemce (nebo jeho software) neustále kontrolovat, zda není něco nového. Wikipedie dále upozorňuje na rozdíly proti známému pojmu „real-time computing“ – v real-time webu jde často o posílání krátkých zpráv, odkazů, statusů či podobných společenských PINGů. Pro lepší představu si lze real-time web představit jako implementaci chování instant messengerů či IRC v prostředí WWW.

Do webu v reálném čase spadá např. i problematika vyhledávání v takových informacích, ovšem její podrobnější popis by přesáhl rámec tohoto článku.

Technické obtíže

Na tu základní technickou obtíž přišel každý, kdo se zabýval myšlenkou napsat si nad webovými technologiemi (přesněji řečeno nad HTTP) vlastní implementaci instant messengeru či chatu. Poslat zprávu na server a tam ji uložit není problém, to dokážeme obyčejným formulářem, ale co dál? Jak zprávu poslat ostatním účastníkům chatu?

Heartbeat

Nakonec většina skončila u postupu, pro který se vžil název „heartbeat“, tedy pravidelné dotazování serveru, jestli není něco nového. Vyvážit rychlost opakování a „iluzi realtime“ je docela potíž, ale v určitých případech jde o dostačující techniku. Ovšem co pro náročnější aplikace?

Nechme stranou vlastní implementace a protokoly, a zůstaňme stále u možností, které dává HTTP. Může server poslat nějak HTTP požadavek klientovi? Jeho IP adresu má; problém ale přinášejí nejrůznější proxy, NATy, firewally a podobné věci, co stojí takovému spojení v cestě. Samosebou, pokud má klient veřejnou IP adresu a povolí ve firewallu příchozí spojení na dohodnutém portu, tak takové zpětné spojení možné je. Ovšem za současné situace je možnost, že všichni účastníci podobného (webového!) chatu budou mít veřejnou IP, čistě hypotetická. Určitou pomoc by mohl představovat protokol IPv6, ovšem i pokud odpadne nutnost používat NAT, budou firewally a proxy servery existovat dál a úspěšně bránit podobným kouskům.

Různě se s těmito problémy potýkají všelijaké P2P služby, ať už pro sdílení souborů nebo třeba pro VoIP (Skype) – ve většině případů implementují techniku podobnou technice „heartbeat“, kdy se pasivní uživatel (ten s neveřejnou IP, za NATem,… – zkrátka v naší terminologii „klient“) dotazuje aktivního, a ten mu posílá data. Existují pak různé triky, jako UDP hole punching, které usnadňují připojení ke klientovi za NATem, ale pokud chceme zůstat ve světě HTTP, tak bohužel nic z toho použít nemůžeme.

Což je škoda, protože existuje spousta služeb, postavených na webových technologiích, kterým by nějaká realtimová funkce prospěla a slušela – nemusí to být zrovna chat, mohou to být nejrůznější kolaborativní nástroje. Pravděpodobně nejzajímavější ukázku možností real-time webu přinesl projekt Google Wave (a jak se dnes ukázalo, nedokázal překročit stín technologického dema) nebo Google Docs, kde mohou jeden dokument upravovat v tutéž chvíli různí lidé (první setkání se situací, kdy se mění slova v dokumentu, který právě píšete, zanechá silný dojem).

Své vlastní P2P techniky nabízí nový Flash Player. Samosebou – není to postavené nad HTTP a používá vlastní protokol, ale je to krok, jak je možné do HTML stránek vložit elementy, které přijímají a v reálném čase zpracovávají zprávy od jiných strojů, aniž by si o ně musely explicitně říct.

Velmi výrazným krokem k real-time webovým aplikacím je návrh technologie WebSocket, implementované zatím v novém Chrome, která standardizuje otvírání komunikačních kanálů se serverem, po kterých může server zasílat klientům zprávy.

Kometa

Dialog s Comet serverem

Moc možností, jak server může poslat zprávu klientovi, není, jak je vidno. Přesto existuje postup, který do jisté míry jako „server push“ funguje, a nazývá se Comet server. Jeho princip je velmi prostý: Klient naváže spojení se serverem standardním způsobem jako při běžném HTTP dotazu, a server odpoví, ale spojení neuzavře a ponechá ho otevřené. Má tak k dispozici legálně otevřený komunikační kanál, po němž může v případě potřeby poslat svou zprávu. Server tak, s trochou obrazotvornosti, vypadá jako kometa: jádro, od něhož se táhnou dlouhé šlahouny neuzavřených spojení…

Nevýhody jsou evidentní a jasné na první pohled: Server si musí udržovat všechna spojení stále živá a blokuje si tím volné prostředky. Počet uživatelů, který jeden takový server obslouží, je tedy omezený. Toto omezení by šlo obejít pomocí dalších „comet hubů“, např. ve spojení s protokolem PubSub, který je zaměřen rovněž na šíření informací v reálném čase. Budete potřebovat Comet server, který taková spojení umí udržet, s běžným Apačem si nevystačíte. Klient nesmí visící spojení uzavřít s timeoutem. A v neposlední řadě nesmí takové spojení uzavřít nějaký jiný pilný síťový prvek na cestě, který usoudí, že třeba hodinu otevřené HTTP spojení, přes které prošlo pět paketů, zaslouží zavřít.

Výhoda je pravděpodobně jediná, zato podstatná: Na straně klienta si vystačíte s běžným webovým prohlížečem, bez jakýchkoli pluginů, doplňků, knihoven…

Jak to klient dělá?

Klient – tedy běžný prohlížeč (míněno na úrovni roku 2010) má několik možností, co s dlouho otevřeným spojením dělat. Jedna z nejběžnějších metod je použít toto spojení jako atribut src neviditelného elementu iframe – když server potřebuje poslat nějakou zprávu, pošle tímto spojením nějaký <script>. Jakmile dorazí prohlížeči nějaký skript, tak jej provede, protože prohlížeče zpracovávají přicházející data postupně, nečekají až na uzavření spojení (to by se leckdy načekaly). Druhá metoda používá AJAX, tedy přesněji řečeno XHR (XMLHttpRequest).

Protože opravdu dlouho udržované spojení by mohlo přinášet řadu nevýhod, používá se do jisté míry kompromisní technika, kdy se klient dotáže serveru, zda jsou nějaké nové zprávy. Server potvrdí navázání spojení, ale nepošle žádná data a spojení nechá otevřené až do doby, dokud nebude mít nějakou zprávu pro daného klienta. Jakmile zprávu má, pošle ji a spojení uzavře. Klient obdrží zprávu, zpracuje ji a položí další dlouhodobý dotaz.

Na straně klienta si tedy vystačíme s běžně používanými a známými postupy – iframe, JSONP, AJAX – a s trochou fantazie. Co na serveru?

Comet server

Jak jsme si už řekli, vyžaduje tento postup server, schopný udržovat dlouhodobá HTTP spojení (což je v přímém protikladu k základnímu požadavku, kladenému na HTTP servery, tedy rychle obsloužit klienta a uvolnit zdroje pro dalšího). S běžným serverem tedy nevystačíme. Naštěstí existuje poměrně dost serverů, které lze pro Comet použít. Mezi ně patří Jetty6 s technikou Continuations (nový Jetty implementuje i WebSockets), Faye, HTTP Push modul pro NGiNX, WebSync pro IIS, StreamHub, Orbited, Jabbify či snadno instalovatelný a komplexní Ajax Push Engine (APE).

Zajímavou alternativou je i Hookbox, který umožňuje pro testovací účely vytvořit vlastní hostovaný Comet server – můžete si tedy (s určitými omezeními) vyzkoušet práci s takovým serverem bez nutnosti cokoli instalovat.

Příklad: Chat s APE

Maskot projektu APE

Maskot projektu APE

Problematika Comet serverů nemůže být v jednom informativním článku probrána do hloubky, a tak záměrně upustíme od dalších a hlubších informací (Bayeux protokol v Dojo) a namísto toho si ukážeme praktické použití takového serveru, a to v roli už několikrát zmíněného chatu. Příklad bude poháněn právě serverem APE.

APE je napsaný v jazyce C a není problém jej nainstalovat na jakýkoli POSIX server. Jeho instalace není nijak obtížná, pro nejčastější linuxové distribuce je dokonce k dispozici v podobě balíčků. Po instalaci a nezbytném nastavení, popsaném v dokumentaci, můžeme rovnou vyzkoušet některé z dodaných ukázkových příkladů, projít si tutoriály nebo pročíst informace o tom, co to vlastně Comet server a technologie AJAX Push je.

Server APE obsahuje nejen vlastní výkonné jádro, ale i JSF, tedy JavaScript Framework, který zapouzdřuje práci s Comet serverem do snadno použitelné a pochopitelné podoby. Je navržený tak, aby dokázal spolupracovat s běžným HTTP serverem (Apache, Lighttpd, IIS, …) a pro běžné použití jej pravděpodobně budete instalovat právě k běžícímu HTTP serveru.

Instalace z balíčků je přímočará. Budete potřebovat mysql-common balíček, pokud jej v systému nemáte. Samozřejmě můžete použít i cestu překladu zdrojových kódů, je-li pro vás schůdnější.

Před testem budete muset nastavit HTTP server tak, aby byl JSF přístupný standardním způsobem (např. http://example­.com/ape-jsf/…) a povolit port – standardně je nastaven 6969. V souboru ape-jsf/Demos/config.js je třeba upravit cesty k souborům, a pak už nic nebrání vyzkoušet dodané příklady.

Pro čtenáře Zdrojáku jsem připravil zkušební APE server, na kterém mohou vyzkoušet fungování APE. Zkušební server je k dispozici jako šablona u hostingu Virtualmaster.

Odkazy

Odkazy k APE:

Začal programovat v roce 1984 s programovatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď by rád neprogramoval a radši se věnoval starým počítačům.

Komentáře: 29

Přehled komentářů

pas P2P...
Misha lightstreamer.com
caracho A pritom by stacilo, kdyby MS umel dodrzovat standardy.
yossarian Re: A pritom by stacilo, kdyby MS umel dodrzovat standardy.
Martin Prokš Internet != HTTP
Martin Malý Re: Internet != HTTP
pas Re: Internet != HTTP
Ivan Nový Bohužel se blíží doba, kdy Internet === Facebook :-)
pcdr Re: Bohužel se blíží doba, kdy Internet === Facebook :-)
BlackRider Takovej dlouhej clanek o takovy blbosti :)
Aleš Roubíček Re: Takovej dlouhej clanek o takovy blbosti :)
BlackRider Re: Takovej dlouhej clanek o takovy blbosti :)
veros Re: Takovej dlouhej clanek o takovy blbosti :)
BlackRider Re: Takovej dlouhej clanek o takovy blbosti :)
setup Re: Takovej dlouhej clanek o takovy blbosti :)
. Re: Takovej dlouhej clanek o takovy blbosti :)
sorki Re: Takovej dlouhej clanek o takovy blbosti :)
MarSik Re: Takovej dlouhej clanek o takovy blbosti :)
BlackRider Re: Takovej dlouhej clanek o takovy blbosti :)
jay Re: Takovej dlouhej clanek o takovy blbosti :)
Martin Malý Re: Takovej dlouhej clanek o takovy blbosti :)
BlackRider Re: Takovej dlouhej clanek o takovy blbosti :)
MarSik Re: Takovej dlouhej clanek o takovy blbosti :)
BlackRider Re: Takovej dlouhej clanek o takovy blbosti :)
dc poznamka
Martin Malý Re: poznamka
100% Lenin Re: poznamka
avo Re: poznamka
zakjan WebSocket
Zdroj: https://www.zdrojak.cz/?p=3308