Programovanie

Napíšte svoju vlastnú MAMU!

MOM je nepochopená a MOM nezíska žiadny kredit. Možno ste už tento počuli, ale v aréne distribuovaných systémov je to skutočne pravda! Je to tak preto, lebo middleware orientovaný na správy (MOM) tradične nepožíva rovnakú úroveň prepracovanosti a podpory ako iné technológie používané v distribuovaných komunikačných rámcoch.

Časy sa však menia. So zavedením sofistikovaných a robustných ponúk dodávateľov rýchlo rastie záujem o systémy MOM. Dobré implementácie MOM poskytujú rozhranie aplikácií na vysokej úrovni, záruky kvality služieb a množstvo služieb, ako sú bezpečnosť, radenie správ a podpora adresárov, ktoré sú potrebné pre „priemyselne silnú“ distribuovanú komunikáciu.

Distribuované komunikačné rámce

Účelom distribuovaného komunikačného rámca je poskytnúť dobrý spôsob komunikácie častí distribuovaného systému. Objektovo orientované rámce túto úlohu plnia tým, že distribuovaným objektom poskytujú spôsob, ako si navzájom posielať správy.

Distribuované objektovo orientované rámce, ktorým sa venuje najväčšia pozornosť, sú tie, ktoré modelujú zasielanie správ pri volaní metódy. CORBA a RMI sú dva vynikajúce príklady tohto typu rámca (pozri Zdroje). Tieto systémy sa často nazývajú systémy vzdialeného volania procedúr (RPC). Kúzlo týchto systémov spočíva v tom, že umožňujú, aby sa vzdialené volania procedúr (alebo metód) javili ako lokálne volania procedúr (LPC).

RPC sú navrhnuté podľa vzoru klient / server. Napríklad objekty CORBA, ktoré vystavujú metódy, ktoré majú byť volané vzdialenými objektmi, sa nazývajú (a sú) servermi.

Predstavujeme MAMU

Na rozdiel od RPC MOM nemodelujú správy ako volania metód; namiesto toho ich modelujú ako udalosti v systéme doručovania udalostí. Klienti odosielajú a prijímajú udalosti alebo „správy“ prostredníctvom rozhraní API, ktoré poskytuje MOM. MOM môže prezentovať adresárové služby, ktoré umožňujú klientom vyhľadať inú aplikáciu, ktorá funguje ako server, alebo môže prezentovať univerzálne „kanály“, ktoré umožňujú skupine klientov komunikovať ako rovnocenní používatelia, alebo môže prezentovať obe možnosti.

Všetky aplikácie navzájom komunikujú priamo pomocou MOM. Správy generované aplikáciami majú zmysel iba pre ostatných klientov, pretože samotné MOM je iba smerovač správ (a v niektorých prípadoch aj systém radenia správ).

MOM majú všetky tvary a veľkosti

Všetky mamičky zdieľajú dve základné charakteristiky: umožňujú prenos správ a prenos správ nie je blokujúci. Okrem týchto základov môžu predajcovia implementovať ľubovoľný počet rôznych rozhraní a služieb.

Mnoho MOM poskytuje rozhranie na publikovanie a prihlásenie na odber, ktoré umožňuje aplikáciám publikovať a prijímať správy, ktoré ich zaujímajú. Toto rozhranie môže mať formu systému založeného na kanáloch alebo jednoduchšieho systému, v ktorom klient registruje typy správ. má záujem o príjem.

Základné MOM poskytujú iba priame správy, žiadne ďalšie služby. Pokročilé MOM poskytujú radenie správ a zaručené doručenie spolu so zabezpečením, zhromažďovaním údajov medzi platformami, škálovateľnosťou a ďalšími výhodami.

MOM v skratke

Tu je rýchly odkaz, ktorý vám pomôže pochopiť, o čom sú mamičky.

Výhody MOM

  • Jednoduché: Klienti publikujú a prihlásia sa na odber

    Zverejniť a prihlásiť sa na odber je užitočná abstrakcia na vysokej úrovni pre to, čo aplikácie musia robiť, aby mohli komunikovať.

  • Ľahké: Nie je potrebné žiadne zložité nastavenie

    MOM sa ľahko inštalujú a používajú na rozdiel od komplexných systémov založených na RPC, ako je CORBA.

  • Generické: Rovnakú MOM je možné použiť pre viac aplikácií

    Pretože akýkoľvek daný systém MOM je v podstate iba všeobecným prenosom správ, je možné ho bez ďalších prác opätovne použiť v rôznych aplikáciách.

  • Flexibilné: Je možné odoslať akýkoľvek druh správy

    MOM môže odovzdať akúkoľvek správu. Pretože mama nerozumie správam, nezáleží na tom, aké sú.

MOM nevýhody

  • Generické: Aplikácie musia porozumieť správam

    Prinútiť aplikácie, aby namiesto volaní metód používali správy, môže byť zložité, najmä ak sa aplikácia spolieha na skutočnosť, že volania metód blokujú.

  • Neznáme: Nemodeluje volania metód

    Vývojári, ktorí nie sú oboznámení so správami, môžu mať problém prísť na to, ako ich efektívne používať.

  • Asynchrónne: Správy neblokujú

    Správy prirodzene neblokujú. To sťažuje písanie aplikácií, ktoré potrebujú blokovanie hovorov.

  • Príliš jednoduché: Žiadne zhromažďovanie údajov

    Aj jednoduché systémy RPC správne zaraďujú údaje. Jednoduché MOM môžu iba posielať správy, v ktorých sú bajty z hľadiska prijímača nefunkčné.

  • Neštandardné: Predajcovia sú všade

    Implementácie MOM predajcu robia všetko ... a nič.

    Upozornenie Emptor

    je fráza, ktorú treba mať na pamäti pri preskúmaní ponúk rôznych dodávateľov.

Kedy sú mamičky vhodné?

  • Pri komunikácii musia aplikácie používať správy
  • Keď programátorský personál nie je zapojený do systému klient / server a RPC
  • Keď sú CORBA / RMI a súvisiace systémy príliš zložité
  • Keď sú jednoduché systémy RPC príliš primitívne

Úvahy o dizajne našej MOM

Teraz, keď už pozadie nie je v ceste, začnime dávať dokopy našu MOM, Správa Bus. Budeme používať MOM na umožnenie komunikácie medzi klientmi distribuovanej tabule. (V časti Zdroje nájdete odkazy na informácie o aplikácii tabule, s ktorou sme pracovali v posledných niekoľkých splátkach.)

Hlavným motívom úvahy pre správu je, že poskytuje pohodlné komunikačné rozhranie na vysokej úrovni pre aplikačné objekty, ktoré ju budú používať.

Pretože kanál má zmysel ako centrálna služba, ktorú by mala poskytovať zbernica správ, rozhranie pre zbernicu správ je Kanál trieda. Klient používa Kanál triedy pre prístup ku všetkým funkciám správy na vysokej úrovni, od prihlásenia na odber a zverejnenia až po zoznam dostupných kanálov v systéme.

The Kanál trieda vystavuje metódy triedy, ktoré ovplyvňujú zbernicu správ ako celok alebo sa týkajú všetkých kanálov. Každá inštancia kanála predstavuje v systéme jeden kanál a poskytuje metódy špecifické pre daný kanál.

Dve rozhrania, ChannelListener a ChannelsUpdateListener, sú poskytované na účely predplatného na príjem správ na kanáli a prijímania oznámení o pridaní kanála.

Obrázok nižšie ilustruje architektúru systému Message Bus.

Pod kapotou

Aplikácia Message Bus pod kapotou používa metódy triedy a dátové štruktúry systému

Kanál

na sledovanie kanálov. Poslucháči kanála implementujú

ChannelListener

implementujú rozhranie a objekty, ktoré chcú dostávať aktualizácie o pridaných kanáloch

ChannelsUpdateListener

rozhranie. Registrované objekty poslucháča volá späť

Kanál

kedykoľvek sa stane niečo zaujímavé. Celá komunikácia s vonkajším svetom sa uskutočňuje pomocou implementácie protokolu

MessageBus

rozhranie, ako napr

MessageBusSocketImpl

.

Každý MessageBus implementácia odovzdáva správy rozhovorom s príslušným serverom prenášajúcim správy, ktorý sa nazýva sprostredkovateľ, cez zdieľaný sieťový prenos, ako sú napríklad sokety alebo adresy URL / servlety. Sprostredkovateľ smeruje správy medzi MessageBus inštancie, z ktorých každý zodpovedá a Kanál trieda.

Pretože všetky tieto implementácie špecifické pre dopravu implementujú MessageBus sú vzájomne zameniteľné. Napríklad na základe servletu MessageBus a sprostredkovateľ môže byť použitý Kanál namiesto zásuviek MessageBus a sprostredkovateľ.

Naša zbernica správ je jednoduchý systém typu peer-to-peer založený na kanáloch, vďaka čomu je vhodný na použitie v aplikácii typu peer-to-peer, ako je napríklad systém spolupráce.

Používanie zbernice správ v klientskej aplikácii

Tieto kroky umožňujú klientovi používať zbernicu správ:

  1. Nastaviť inštanciu MessageBus.

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

    V tejto výzve nový MessageBus implementácia sa vytvorí, pričom sprostredkovateľ je identifikovaný podľa argumentov volania konštruktora.

  2. Prihláste sa na odber kanála.

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

    Toto volanie vráti inštanciu kanála zodpovedajúcu argumentu názvu kanála. Ak kanál neexistuje, vytvorí sa v systéme.

    Prihrávka toto ako argument znamená, že samotný volajúci je a ChannelListener. Volajúci sa môže prihlásiť na odber nielen sám, ale aj ľubovoľný ChannelListener na ľubovoľný počet poslucháčov jedného kanála.

  3. Zverejnite správu na kanáli.

     textChannel.publish (nový reťazec (myID + "hovorí Ahoj!")); 

    Zverejnenie správy je jednoduché a neznamená nič iné ako volanie zverejniť () na vybranej inštancii kanála. Upozorňujeme, že správa môže byť ľubovoľného typu objektu, pokiaľ jej ostatní klienti na kanáli rozumejú, a server má prístup k súborom (-om) triedy správy (ako je podrobne uvedené v časti Používanie zbernice správ).

Medzi ďalšie voliteľné kroky patria:

  • Zrušiť odber poslucháča kanála.

     textChannel.unsubscribe (ChannelListener); 

    Táto metóda zruší odhlásenie menovaného ChannelListener z kanála, čo znamená, že poslucháč nedostane žiadne nové správy. Ak už poslucháčov viac nepotrebujete, mali by byť týmto spôsobom odhlásení.

  • Získajte zoznam názvov kanálov.

     Výpočet Channel.getChannelNames (); 

    Táto metóda vráti názvy všetkých kanálov dostupných na zbernici správ.

  • Prihláste sa na odber a získajte novo pridané kanály.

     Channel.subscribeChannelsUpdate (ChannelsUpdateListener); 

    A ChannelsUpdateListener sa môžu prihlásiť na odber aktualizácií, keď sa do zbernice správ pridajú kanály.

  • Prestať prijímať novo pridané kanály.

     Channel.unsubscribeChannelsUpdate (ChannelsUpdateListener); 

    A ChannelsUpdateListener je možné odhlásiť z aktualizácií o pridanie kanála. Ak už poslucháčov viac nepotrebujete, mali by byť týmto spôsobom odhlásení.

  • Pridajte do kanálu viac poslucháčov.

     textChannel.subscribe (ChannelListener); 

    Táto metóda umožňuje volajúcemu prihlásiť sa na odber ďalších poslucháčov kanála.

     Reťazec textChannel.getName (); 

    Táto metóda vracia názov tejto inštancie kanála.

Rozhranie ChannelListener

The ChannelListener rozhranie musí byť implementované akýmkoľvek objektom, ktorý chce byť aktualizovaný, keď príde správa na konkrétnom kanáli.

verejné rozhranie ChannelListener {public void messageReceived (kanál kanálu, správa objektu); } 

Vo väčšine prípadov klient, ktorý žiada o Kanál inštancia sa prihlási na odber kanála a sama implementuje toto rozhranie, ale nie je to potrebné. V súlade s adaptérmi udalostí JDK 1.1 si klient môže prihlásiť na kanál iný objekt, takže bude spotrebovávať správy generované kanálom.

V skutočnosti sa jeden objekt poslucháča môže prihlásiť na odber viacerých kanálov, ktoré budú volať poslucháčom správa prijatá() zakaždým, keď na niektorom z kanálov príde správa. The správa prijatá () volanie metódou poskytuje prístup na kanál, na ktorom sa správa objavila, umožňuje správa prijatá () na oddelenie správ podľa pôvodného kanálu.

Rozhranie ChannelsUpdateListener

ChannelsUpdateListener musí byť implementovaný akýmkoľvek objektom, ktorý chce byť aktualizovaný, keď je pridaný kanál.

verejné rozhranie ChannelsUpdateListener {public void channelAdded (názov reťazca); } 

Trieda Kanál

The Kanál trieda slúži na dva účely:

  • Poskytuje jednoduchú abstrakciu ako rozhranie pre klienta pomocou zbernice správ
  • Udržuje globálny stav o dostupných kanáloch a prenáša správy z kanálov do servera MessageBus implementáciu a prijíma aktualizácie z MessageBus implementácia

Kanál inštancie vytvára a ukladá Kanálstatický kód. Odkazy na ne sú rozdávané Channel.subscribe () podľa požiadavky klienta. Každý Kanál inštancia je v rámci procesu JVM jedinečná.

kanál verejnej triedy {

protected static boolean busSet = false; chránená statická zbernica MessageBus; chránené statické kanály Hashtable = nová Hashtable (); chránený statický Vektor kanályUpdateListeners = nový Vector ();

public static synchronized void setMessageBus (MessageBus mb) throws IOException {if (! busSet) {bus = mb; bus.initBroker (); busSet = true; } else System.out.println ("Nie je možné nastaviť MessageBus viac ako raz za behu!"); }

public static Reťazec getBrokerName () {návrat bus.getBrokerName (); }

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

Tieto metódy triedy umožňujú MessageBus inštancia, ktorá sa má nastaviť jedenkrát za každé spustenie, a vrátiť informácie o názvoch zbernice a kanálov.

 verejné statické synchronizované prihlásenie na odber kanála (názov reťazca, ChannelListener cl) vyvolá výnimku IOException {Channel ch; if (channels.containsKey (name)) ch = (Channel) channels.get (name); else {bus.addChannel (meno); ch = nový kanál (názov); channels.put (meno, ch); } ch.subscribe (cl); vrátiť ch; } 

Táto metóda triedy vráti inštanciu kanála zodpovedajúcu názvu kanála. Vytvára kanál a hovory MessageBus pridať do systému, ak ešte neexistuje. Hneď ako je kanál vytvorený, je u neho zaregistrovaný jeho počiatočný poslucháč.

// volané klientmi na registráciu ChannelsUpdateListener public static void subscribeChannelsUpdates (ChannelsUpdateListener cul) {channelsUpdateListeners.addElement (cul); }

// volané klientmi na zrušenie registrácie ChannelsUpdateListener public static void unsubscribeChannelsUpdates (ChannelsUpdateListener cul) {channelsUpdateListeners.removeElement (cul); }

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