Obsah

Tři JMS 1.1 implementace

V tomto postu bych popsal několik implementaci Java Message Service 1.1, konkrétně Apache ActiveMQ 5.0, JBoss Messaging 1.4 a TIBCO EMS 4.4. Nebudu srovnávat, spíše jen shrnu klíčové vlastnosti a svoje pocity.

Apache ActiveMQ 5.0

Tento server je napsán v Javě, takže běží na mnoha platformách a jeho nejzajímavější vlastností je možnost výměny transportní vrstvy. K dispozici je kromě standardních TCP, UDP a SSL také VM (spojení v rámci virtual machine), HTTP, multicast, peer, jgroup (distribuované protokoly) a několik dalších. Kromě toho lze také kombinovat URI do load balanced nebo reliable seznamů kdy klient vybírá náhodné resp. první spojení. A do třetice lze využít dva discovery protokoly, kdy server může požádat o spojení. Příklad failoveru:

reliable:vm://foo:61699,ssl://bar:61617,tcp://whatnot:61698

Pro TCP implementace používá OpenWire/Stomp, čímž je umožněno vytvářet klienty i v jiných jazicích, než je Java (například .NET), pochopitelně jste ale omezeni jen na určité transporty.

Cíle jsou čistě dynamické, to znamená, že není třeba vůbec vytvářet žádné cíle v konfigurace serveru. Jakmile si klient cíl vyžádá, je vytvořen – je však zde možnost cíle vytvářet předem v XML konfiguraci při startu serveru. Co se týká bezpečnosti, tak tam jsou možnosti poněkud omezené, nastavovat lze pouze read/write/admin. Podpora uživatelů je postavena na JAASu.

Ukládání je realizováno do žurnálu (open-source projekty Howl a Kaha) na disku, který si hlídá konzistenci a lze jej replikovat na jiné servery. Dodatečně lze konfigurovat ukládání do SQL databáze přes JDBC, což funguje v synergii s žurnálem. Do žurnálu se ukládají data co nejrychleji a ty jsou pak ve „volných chvílích“ bezpečně přenášena do databáze. U ActiveMQ je možné nastavit také ukládání pouze do JDBC, ale autoři varují, že to může být pomalé.

Je možné přesměrovávat cíle pomocí composite destinations, kde lze aplikovat i filtrování. Subscriber také může použít zástupné znaky hvězdička a zobák vpravo, což používají i jiní vendoři (ale není to součást JMS 1.1 specifikace).

Doslova parádním číslem u ActiveMQ jsou message groups. Ty dovolují vytvořit skupinu exkluzivních odběratelů fronty. Když programátor potřebuje zaručit sekvenční zpracování zpráv, obvykle označí frontu jako exkluzivní – to ve výsledku znamená, že frontu může odebírat pouze jeden odběratel – ten může selhat a zpracování se zastaví. Díky message groupám je možné vytvořit celou skupinu consumerů, kteří budou paralelně zpracovávat zprávy, ale bude z ajištěno správné pořadí zpracování. Tak lze zajistit vysokou dostupnost a failover. ActiveMQ nabízí podobnou možnost také pro topicy pomocí virtual topics.

Jako velmi zajímavou považuji podporu AJAXu a RESTu. Pomocí servletu a javascript knihovny (resp. v případě RESTu jen pomocí servletu) – jsou dodávány společně s ActiveMQ – lze posílat a přijímat zprávy z prohlížeče (resp. přes web). Příklad – chci poslat data do fronty orders, zavolám:

http://www.acme.com/queue/orders/input

Data z HTTP POST požadavku se do fronty zařadí. Není to sice nejefektivnější možnost, jak posílat zprávy, ale pokud je klient dostatečně kvalitní a má pipeline processing, tak proč ne. Podpora AJAXu je velmi podobná – dodáte do kontejneru servlet z ActiveMQ a do HTML kódu vložíte javascript knihovnu a nastavíte URL pro komunikaci na tento servlet. Poté již přímo posíláte zprávy, ve kterých může být kdovíco – třeba HTML stránky.

Mezi další vlastnosti pak patří přemostění na jiný JMS server, JCA 1.5 connector pro J2EE servery, JMX monitoring a snadná integrace do Springu. Jak jsem zmínil, ActiveMQ je napsán v Javě. Jádro jsou springové komponenty, takže konfigurace je – světe div se – pomocí XML (spring beans). Po spuštění můžete použít také webové administrační rozhraní, ve kterém lze vytvářet a mazat cíle, sledovat statistiky cílů, prohlížet zprávy ve frontách a subscribery, dokonce posílat a přijímat (RSS, ATOM) JMS zprávy a sledovat celkové statistiky včetně nějakých těch grafů. Rozhraní je dostupné po startu na adrese http://localhost:8161/admin/.

Spuštění základní konfigurace trvalo na mém počítači asi 15 vteřin. Jako velmi sympatické se mi jeví možnost snadno odstranit nepotřebné knihovny i webové rozhraní a dostat se na příjemných 3,8 MB jar souborů (k dipozici je dokonce -all.jar o velikosti něco málo přes 2 MB). ActiveMQ je špičkový JMS server distribuovaný pod Apache licencí.

JBoss Messaging 1.4

První, co mě trošku překvapilo u tohoto JMS serveru napsaného v Javě, byla velikost – celý produkt se vešel do jednoho souboru jboss-messaging.jar o velikosti 1 MB, klientský jar má polovic a do CLASSPATH potřebujete vměstnat kromě serveru také servisní archiv jboss-messaging.sar o velikosti pár kilobajtů – obsahuje konfiguraci (konkrétně XML definici JMX beanů pro JBoss). A pak mi to docvaklo – k běhu potřebujete samozřejmě JBoss AS.

Instalace je komplikovanější, ale můžete použít Ant skript, který může některé věci usnadnit. Důvodem je fakt, že JBoss Messaging 1.4 je v beta fázi a bude součástí JBoss AS až ve verzi 5.0. Konfigurace cílů se provádí také pomocí XML souborů, což se liší například od zminěného ActiveMQ, kde je konfigurace cílů uložena v žurnálu.

Transportní vrstva je TCP, HTTP a SSL. Ukládání je realizováno pomocí JDBC, bohužel jsem neprováděl žádné testy, ale bylo by zajímavé srovnat rychlost JBoss Messagingu s jinými produkty. Co se týká bezpečnosti tam je situace podobná – JAAS. Přemostění na jiný server (jiného vendora) je možný stejně jako distribuované transakce pomocí JBoss Transactions (u ActiveMQ se používá XA Transactions).

JBoss umí podobně jako ActiveMQ distribuované topicy i fronty včetně shared durable subscriptions (u ActiveMQ se to nazývá jinak – viz výše) . Výhodou je inteligentní load-balancing, který umí dynamicky rozkládat zátěž. Možnosti směrování jsou rozsáhlejší, než je tomu u ActiveMQ, zejména lze bridgům přidělovat QOS.

JBoss Messaging má hlavní výhodu v těsné integraci s aplikačním serverem JBoss – nemusíte nic instalovat, spustíte server a voilla, máte messaging. Výborný mikrokernel JBoss platformy (postavený na JMX) je zárukou dobré škálovatelnosti. Trošku bych se obával výkonu (střílím od boku), nicméně špičková podpora clusterování může vše dohnat (potom už není až takový problém nižší výkon jednoho uzlu).

TIBCO EMS 4.4

TIBCO Enterprise Message Service je produkt napsaný v jazyce C pro optimální výkon. Hlavní znaky:

Tento produkt jsem popsal na zvláštní stránce.