Programování

Napište vlastní MAMU!

MOM je nepochopena a MOM nedostává žádný kredit. Možná jste to už někdy slyšeli, ale v aréně distribuovaných systémů je to ve skutečnosti pravda! Důvodem je, že middleware orientovaný na zprávy (MOM) tradičně nepožívá stejnou úroveň propracovanosti a podpory jako jiné technologie používané v distribuovaných komunikačních rámcích.

Ale doba se mění. Se zavedením sofistikovaných a robustních nabídek dodavatelů rychle roste zájem o systémy MOM. Dobré implementace MOM poskytují rozhraní aplikací na vysoké úrovni, záruky kvality služeb a celou řadu služeb, jako je zabezpečení, front zpráv a podpora adresářů, které jsou nezbytné pro „průmyslovou“ distribuovanou komunikaci.

Distribuované komunikační rámce

Účelem rámce distribuované komunikace je poskytnout dobrý způsob komunikace částí distribuovaného systému. Objektově orientované rámce plní tento úkol tím, že poskytují distribuovaným objektům způsob, jak si navzájem posílat zprávy.

Distribuované objektově orientované rámce, které si získají největší pozornost, jsou ty, které modelují zasílání zpráv při volání metody. CORBA a RMI jsou dva vynikající příklady tohoto typu rámce (viz Zdroje). Tyto systémy se často nazývají systémy vzdáleného volání procedur (RPC). Kouzlo těchto systémů spočívá v tom, že způsobují, že se vzdálená volání procedur (nebo metod) zdají být lokálními voláními procedur (LPC).

RPC jsou navrženy podle vzoru klient / server. Například objekty CORBA, které vystavují metody, které mají být volány vzdálenými objekty, se nazývají (a jsou) servery.

Představujeme MOM

Na rozdíl od RPC MOM nemodelují zprávy jako volání metod; místo toho je modelují jako události v doručovacím systému událostí. Klienti odesílají a přijímají události nebo „zprávy“ prostřednictvím rozhraní API, která poskytuje MOM. MOM může prezentovat adresářové služby, které umožňují klientům vyhledat jinou aplikaci, která funguje jako server, nebo může prezentovat univerzální „kanály“, které umožňují skupině klientů komunikovat jako partneři, nebo může představovat obě možnosti.

Všechny aplikace spolu komunikují přímo pomocí MOM. Zprávy generované aplikacemi mají smysl pouze pro ostatní klienty, protože samotná MOM je pouze směrovač zpráv (a v některých případech také systém front zpráv).

Maminky přicházejí ve všech tvarech a velikostech

Všechny MOM sdílejí dvě základní charakteristiky: umožňují předávání zpráv a předávání zpráv neblokuje. Kromě těchto základů mohou prodejci implementovat libovolný počet různých rozhraní a služeb.

Mnoho MOM poskytuje rozhraní pro publikování a odběr, které aplikacím umožňuje publikovat a přijímat zprávy, které je zajímají. Toto rozhraní může mít podobu systému založeného na kanálech nebo jednoduššího systému, ve kterém klient registruje typy zpráv má zájem o příjem.

Základní MOM poskytují pouze přímé zasílání zpráv, žádné další služby. Pokročilé MOM poskytují frontování zpráv a zaručené doručení spolu se zabezpečením, sběrem dat mezi platformami, škálovatelností a dalšími výhodami.

MOM na první pohled

Zde je stručný odkaz, který vám pomůže získat přehled o tom, o čem MOM jsou.

Výhody MOM

  • Jednoduchý: Klienti publikují a odebírají

    publish-and-subscribe is a useful high-level abstraction for what apps need to do to communicate.

  • Snadný: Není nutné složité nastavení

    MOM se snadno instalují a používají, na rozdíl od komplexních systémů založených na RPC, jako je CORBA.

  • Obecný: Stejnou MOM lze použít pro více aplikací

    Protože jakýkoli daný systém MOM je v podstatě jen obecný přenos zpráv, lze jej znovu použít v různých aplikacích bez jakékoli další práce.

  • Flexibilní: Lze předat jakýkoli druh zprávy

    MOM může předat jakoukoli zprávu. Protože MOM nerozumí zprávám, nezáleží na tom, jaké jsou.

Nevýhody MOM

  • Obecný: Aplikace musí rozumět zprávám

    Vytváření aplikací tak, aby místo volání metod používaly zprávy, může být složité, zvláště pokud se aplikace spoléhá na skutečnost, že volání metod blokují.

  • Neznámý: Nemodeluje volání metod

    Vývojáři, kteří zprávy neznají, mohou mít problém přijít na to, jak je efektivně používat.

  • Asynchronní: Zprávy neblokují

    Zprávy přirozeně neblokují. To ztěžuje psaní aplikací, které vyžadují blokování hovorů.

  • Příliš jednoduché: Žádné zařazování dat

    Dokonce i jednoduché systémy RPC správně zařazují data. Jednoduché MOM mohou jen posílat zprávy, ve kterých jsou bajty mimo provoz z hlediska přijímače.

  • Nestandardní: Prodejci jsou všude

    Implementace MOM dodavatele dělají všechno ... a nic.

    Upozornění Emptor

    je fráze, kterou je třeba mít na paměti při kontrole nabídek různých dodavatelů.

Kdy jsou MOM vhodné?

  • Při komunikaci musí aplikace používat zprávy
  • Když programovací personál není zapojen do systému klient / server a RPC
  • Když jsou CORBA / RMI a související systémy příliš složité
  • Když jsou jednoduché systémy RPC příliš primitivní

Aspekty designu pro naši MOM

Nyní, když je pozadí z cesty, pojďme dát dohromady naši MOM, Sběrnice zpráv. Budeme používat MOM k povolení komunikace mezi klienty distribuované tabule. (V části Zdroje najdete odkazy na informace o aplikaci tabule, se kterou jsme pracovali v posledních několika splátkách.)

Hlavním důvodem pro Message Bus je, že poskytuje pohodlné komunikační rozhraní na vysoké úrovni pro aplikační objekty, které ji budou používat.

Protože kanál má smysl jako centrální služba, kterou by měla sběrnice zpráv poskytovat, je rozhraní pro sběrnici zpráv Kanál třída. Klient používá Kanál třída pro přístup ke všem funkcím na vysoké úrovni sběrnice zpráv, od předplatného a publikování až po výpis dostupných kanálů v systému.

The Kanál class vystavuje metody třídy, které ovlivňují Message Bus jako celek nebo se týkají všech kanálů. Každá instance kanálu představuje jeden kanál v systému a zpřístupňuje metody specifické pro kanál.

Dvě rozhraní, ChannelListener a ChannelsUpdateListener, jsou poskytovány pro účely přihlášení k odběru přijímání zpráv na kanálu a přijímání oznámení o přidání kanálu.

Obrázek níže ilustruje architekturu systému Message Bus.

Pod kapotou

Pod kapotou používá aplikace Message Bus metody třídy a datové struktury

Kanál

sledovat kanály. Posluchači kanálu implementují

ChannelListener

implementují rozhraní a objekty, které chtějí dostávat aktualizace o přidaných kanálech

ChannelsUpdateListener

rozhraní. Registrované objekty posluchače jsou volány zpět uživatelem

Kanál

kdykoli se stane něco zajímavého. Veškerá komunikace s vnějším světem se provádí pomocí implementace

MessageBus

rozhraní, například

MessageBusSocketImpl

.

Každý MessageBus implementace předává zprávy rozhovorem s odpovídajícím serverem pro předávání zpráv, který se nazývá zprostředkovatel, přes sdílený síťový přenos, jako jsou zásuvky nebo URL / servlety. Zprostředkovatel směruje zprávy mezi MessageBus instance, z nichž každá odpovídá a Kanál třída.

Protože tyto implementace specifické pro dopravu implementují všechny MessageBus rozhraní, jsou zaměnitelné. Například na servletu MessageBus a makléř může být použit Kanál místo zásuvky založené MessageBus a makléř.

Naše Message Bus je jednoduchý systém typu peer-to-peer založený na kanálech, díky čemuž je vhodný pro použití v aplikaci typu peer-to-peer, jako je systém pro spolupráci.

Používání sběrnice zpráv v klientské aplikaci

Tyto kroky umožňují klientovi používat sběrnici zpráv:

  1. Nastavit instanci MessageBus.

     Channel.setMessageBus (nový MessageBusSocketImpl (BROKER_NAME, BROKER_PORT)); 

    V této výzvě nový MessageBus je vytvořena implementace, přičemž broker je identifikován argumenty volání konstruktoru.

  2. Přihlaste se k odběru kanálu.

     Channel textChannel = Channel.subscribe ("text_channel", toto); 

    Toto volání vrací instanci kanálu odpovídající argumentu názvu kanálu. Pokud kanál neexistuje, vytvoří se v systému.

    Přihrávka tento jako argument znamená, že ten volající je sám ChannelListener. Volající si může předplatit nejen sebe, ale libovolné ChannelListener na kanál nebo libovolný počet posluchačů na jeden kanál.

  3. Publikujte zprávu na kanál.

     textChannel.publish (nový řetězec (myID + "říká Hello!")); 

    Zveřejnění zprávy je snadné a nevyžaduje nic jiného než volání publikovat() na vybrané instanci kanálu. Zpráva může být jakéhokoli typu objektu, pokud jí ostatní klienti na kanálu rozumějí, a server má přístup k souborům třídy zprávy (jak je podrobně uvedeno v části Používání sběrnice zpráv)

Mezi další volitelné kroky patří:

  • Zrušit odběr posluchače kanálu.

     textChannel.unsubscribe (ChannelListener); 

    Tato metoda zruší odběr pojmenovaného ChannelListener z kanálu, což znamená, že posluchač neobdrží žádné nové zprávy. Pokud již posluchače nejsou potřeba, měli by být tímto způsobem odhlášeni.

  • Získejte seznam názvů kanálů.

     Výčet Channel.getChannelNames (); 

    Tato metoda vrací názvy všech kanálů dostupných na sběrnici zpráv.

  • Přihlaste se k odběru a získejte nově přidané kanály.

     Channel.subscribeChannelsUpdate (ChannelsUpdateListener); 

    A ChannelsUpdateListener se mohou přihlásit k odběru a dostávat aktualizace, když jsou kanály přidány do sběrnice zpráv.

  • Přestaňte přijímat nově přidané kanály.

     Channel.unsubscribeChannelsUpdate (ChannelsUpdateListener); 

    A ChannelsUpdateListener lze odhlásit z odběru aktualizací o přidání kanálu. Pokud již posluchače nejsou potřeba, měli by být tímto způsobem odhlášeni.

  • Přidejte do kanálu více posluchačů.

     textChannel.subscribe (ChannelListener); 

    Tato metoda umožňuje volajícímu přihlásit se k odběru dalších posluchačů kanálu.

     Řetězec textChannel.getName (); 

    Tato metoda vrací název této instance kanálu.

Rozhraní ChannelListener

The ChannelListener rozhraní musí být implementováno jakýmkoli objektem, který chce být aktualizován, když přijde zpráva na konkrétním kanálu.

veřejné rozhraní ChannelListener {public void messageReceived (kanál kanálu, zpráva objektu); } 

Ve většině případů klient, který požádá o Kanál instance se přihlásí k odběru kanálu a implementuje toto rozhraní sama, ale není to nutné. V souladu s adaptéry událostí JDK 1.1 si klient může předplatit jiný objekt kanálu, takže bude využívat zprávy generované kanálem.

Ve skutečnosti se jeden objekt posluchače může přihlásit k odběru více kanálů, které budou volat posluchače zpráva přijata() pokaždé, když na některém z kanálů přijde zpráva. The zpráva přijata () volání metody poskytuje přístup ke kanálu, kde se zpráva objevila, umožňuje zpráva přijata () oddělit zprávy podle původního kanálu.

Rozhraní ChannelsUpdateListener

ChannelsUpdateListener musí být implementován jakýmkoli objektem, který chce být aktualizován, když je přidán kanál.

veřejné rozhraní ChannelsUpdateListener {public void channelAdded (název řetězce); } 

Třída Kanál

The Kanál třída slouží dvěma účelům:

  • Poskytuje jednoduchou abstrakci jako rozhraní pro klienta pomocí sběrnice zpráv
  • Udržuje globální stav o dostupných kanálech a předává zprávy z kanálů do MessageBus implementace a dostává aktualizace z MessageBus implementace

Kanál instance jsou vytvářeny a ukládány uživatelem Kanálstatický kód. Odkazy na ně jsou rozdávány Channel.subscribe () dle požadavku klienta. Každý Kanál instance je v rámci procesu JVM jedinečná.

kanál veřejné třídy {

protected static boolean busSet = false; chráněná statická sběrnice MessageBus; chráněné statické kanály Hashtable = nová Hashtable (); protected static Vector channelsUpdateListeners = new Vector ();

public static synchronized void setMessageBus (MessageBus mb) throws IOException {if (! busSet) {bus = mb; bus.initBroker (); busSet = true; } else System.out.println ("Nelze nastavit MessageBus více než jednou za běh!"); }

public static Řetězec getBrokerName () {návrat bus.getBrokerName (); }

public static Enumeration getChannelNames () {return channels.keys (); }

Tyto metody třídy umožňují MessageBus instance se nastaví jednou pro každé běhové prostředí a vrátí informace o názvech sběrnic a kanálů.

 public static synchronized Channel subscribe (String name, ChannelListener cl) throws IOException {Channel ch; if (channels.containsKey (name)) ch = (Channel) channels.get (name); else {bus.addChannel (name); ch = nový kanál (název); channels.put (name, ch); } ch.subscribe (cl); návrat ch; } 

Tato metoda třídy vrací instanci kanálu odpovídající názvu kanálu. Vytvoří kanál a hovory MessageBus přidat do systému, pokud ještě neexistuje. Jakmile je kanál vytvořen, je u něj zaregistrován jeho počáteční posluchač.

// volání klienty k registraci ChannelsUpdateListener public static void subscribeChannelsUpdates (ChannelsUpdateListener cul) {channelsUpdateListeners.addElement (cul); }

// volání klienty k odregistrování veřejného statického kanálu ChannelsUpdateListener void unsubscribeChannelsUpdates (ChannelsUpdateListener cul) {channelsUpdateListeners.removeElement (cul); }

$config[zx-auto] not found$config[zx-overlay] not found