Programiranje

Napišite svojo MAMO!

MAMA je narobe razumljena in MAMA ne dobi nobenega kredita. Morda ste tega že slišali, toda v areni porazdeljenih sistemov to dejansko drži! To je zato, ker vmesna programska oprema, usmerjena v sporočila (MOM), tradicionalno ni bila deležna enake stopnje prefinjenosti in podpore kot druge tehnologije, ki se uporabljajo v porazdeljenih komunikacijskih okvirih.

A časi se spreminjajo. Z uvedbo sofisticirane in robustne ponudbe ponudnikov zanimanje za sisteme MOM hitro narašča. Dobre izvedbe MOM nudijo vmesnik aplikacij na visoki ravni, garancije za kakovost storitev in številne storitve, kot so varnost, čakanje v čakalnih vrstah in podpora za imenike, ki so potrebne za porazdeljeno komunikacijo "industrijske moči".

Porazdeljeni komunikacijski okviri

Namen okvira porazdeljene komunikacije je zagotoviti dober način za komunikacijo delov porazdeljenega sistema. Objektno usmerjeni okviri to nalogo dosežejo tako, da distribuiranim objektom omogočajo medsebojno sporočanje.

Največ pozornosti dobijo porazdeljeni objektno usmerjeni okviri, ki sporočanje modelirajo kot klice metod. CORBA in RMI sta dva odlična primera te vrste okvira (glej Viri). Te sisteme pogosto imenujemo sistemi oddaljenih klicev (RPC). Čarovnost teh sistemov je v tem, da kličejo oddaljene postopke (ali metode) kot lokalne klice postopkov (LPC).

RPC-ji so zasnovani na vzorcu odjemalec / strežnik. Predmeti CORBA, ki izpostavljajo metode, ki jih kličejo oddaljeni predmeti, se na primer imenujejo (in so) strežniki.

Predstavljamo MAMO

V nasprotju s RPC-ji MOM-i ne modelirajo sporočil kot klicev metod; namesto tega jih modelirajo kot dogodke v sistemu za izvedbo dogodkov. Stranke pošiljajo in prejemajo dogodke ali "sporočila" prek API-jev, ki jih ponuja MOM. MOM lahko predstavi imeniške storitve, ki strankam omogočajo, da poiščejo drugo aplikacijo, ki deluje kot strežnik, ali pa predstavi večnamenske "kanale", ki skupini odjemalcev omogočajo komunikacijo kot enakovredne aplikacije, ali pa predstavi obe možnosti.

Vse aplikacije neposredno komunicirajo med seboj z uporabo MOM-a. Sporočila, ki jih ustvarijo aplikacije, so smiselna samo za druge odjemalce, ker je MOM sama le usmerjevalnik sporočil (in v nekaterih primerih tudi sistem čakalnih sporočil).

Mame so v vseh oblikah in velikostih

Vse MOM imajo dve temeljni značilnosti: omogočajo posredovanje sporočil in posredovanje sporočil ne blokira. Poleg teh osnov lahko prodajalci izvajajo poljubno število različnih vmesnikov in storitev.

Veliko MOM-ov ponuja vmesnik za objavo in naročanje, ki aplikacijam omogoča objavljanje in prejemanje sporočil, ki jih zanimajo. Ta vmesnik je lahko v obliki sistema na podlagi kanalov ali bolj preprostega sistema, v katerem odjemalec registrira vrste sporočil zanima ga prejemanje.

Osnovne MOM-je ponujajo samo neposredna sporočila, brez dodatnih storitev. Napredne MOM-ove zagotavljajo čakalno vrsto sporočil in zagotovljeno dostavo, skupaj z varnostjo, večplastnim razvrščanjem podatkov, razširljivostjo in drugimi ugodnostmi.

Mame na prvi pogled

Tukaj je hitra referenca, ki vam bo pomagala, da se seznanite s tem, kaj sploh so MOM.

MOM prednosti

  • Preprosto: Stranke objavljajo in se naročajo

    objavi in ​​naroči se je uporabna abstrakcija na visoki ravni za to, kaj morajo aplikacije narediti za komunikacijo.

  • Enostavno: Zapletena nastavitev ni potrebna

    MOM-je je enostavno namestiti in uporabljati, za razliko od zapletenih sistemov, ki temeljijo na RPC, kot je CORBA.

  • Splošno: Isti MOM se lahko uporablja za več aplikacij

    Ker je kateri koli sistem MOM v bistvu le splošni prevoz sporočil, ga je mogoče znova uporabiti v različnih aplikacijah brez kakršnega koli dodatnega dela.

  • Prilagodljiv: Pošlje se lahko vsako in vsako vrsto sporočila

    MOM lahko pošlje katero koli sporočilo. Ker MAMA sporočil ne razume, je vseeno, kakšna so.

MOM pomanjkljivosti

  • Splošno: Aplikacije morajo razumeti sporočila

    Če aplikacije uporabljajo sporočila namesto klicev metode, je lahko težavno, še posebej, če se aplikacija opira na dejstvo, da klici metode blokirajo.

  • Neznan: Ne modelira klicev metode

    Razvijalci, ki sporočil ne poznajo, imajo lahko težave pri iskanju, kako jih učinkovito uporabiti.

  • Asinhrono: Sporočila niso blokirana

    Sporočila običajno ne blokirajo. To otežuje pisanje aplikacij, ki potrebujejo blokiranje klicev.

  • Preveč preprosto: Ni razvrščanja podatkov

    Tudi preprosti sistemi RPC pravilno razvrščajo podatke. Preproste MOM-e lahko samo pošiljajo sporočila, v katerih bajti niso v redu z vidika sprejemnika.

  • Nestandardne: Prodajalci so povsod

    Izvedbe ponudnikov MOM naredijo vse ... in nič.

    Caveat Emptor

    je stavek, ki ga morate upoštevati pri pregledu različnih ponudb ponudnikov.

Kdaj so mamice primerne?

  • Pri komunikaciji aplikacije morajo uporabljati sporočila
  • Kadar osebje za programiranje ni povezano s sistemom odjemalec / strežnik in RPC
  • Kadar so CORBA / RMI in sorodni sistemi preveč zapleteni
  • Ko so preprosti RPC sistemi preveč osnovni

Premisleki o oblikovanju naše MOM

Zdaj, ko ozadje ni na poti, začnimo sestavljati našo MAMO, Sporočilo Bus. MOM bomo uporabili za omogočanje komunikacije med odjemalci razdeljene table. (Glejte Vire za povezave do informacij o tabli, s katero smo sodelovali v zadnjih nekaj obrokih.)

Glavni dejavnik Message Bus je ta, da nudi priročen komunikacijski vmesnik na visoki ravni za predmete aplikacije, ki ga bodo uporabljali.

Ker je kanal smiselno kot osrednja storitev, ki bi jo morala zagotavljati Message Bus, je vmesnik do Message Bus-ja Kanal razred. Naročnik uporablja Kanal razreda za dostop do vseh funkcij na visoki ravni Message Bus, od naročnine in objavljanja do naštevanja razpoložljivih kanalov v sistemu.

The Kanal class izpostavlja metode razredov, ki vplivajo na Message Bus kot celoto ali se nanašajo na vse kanale. Vsak primerek kanala predstavlja en kanal v sistemu in izpostavlja metode, specifične za kanal.

Dva vmesnika, ChannelListener in ChannelsUpdateListener, so na voljo za naročanje na prejemanje sporočil na kanalu in prejemanje obvestil o dodajanju kanala.

Spodnja slika prikazuje arhitekturo sistema Bus Bus.

Pod pokrovom

Pod pokrovom aplikacija Message Bus uporablja metode razredov in podatkovne strukture za

Kanal

za sledenje kanalov. Poslušalci kanala izvajajo

ChannelListener

vmesnik in predmeti, ki želijo prejemati posodobitve o dodajanju kanalov, izvajajo

ChannelsUpdateListener

vmesnik. Registrirane predmete poslušalca pokliče nazaj

Kanal

kadarkoli se zgodi kaj zanimivega. Vsa komunikacija z zunanjim svetom poteka z izvajanjem posebnega prometa

MessageBus

vmesnik, kot je

MessageBusSocketImpl

.

Vsak MessageBus izvedba sporočila posreduje tako, da se pogovori z ustreznim strežnikom za posredovanje sporočil, imenovanim posrednik, prek omrežnega prenosa v skupni rabi, kot so vtičnice ali URL / servleti. Posrednik usmerja sporočila med MessageBus primerov, od katerih vsak ustreza a Kanal razred.

Ker te izvedbe, specifične za promet, izvajajo MessageBus vmesnika, so zamenljivi. Na primer, na osnovi strežnika MessageBus in posrednik lahko uporablja Kanal namesto vtičnic MessageBus in posrednik.

Naše sporočilo Bus je preprost sistem enakovrednih naprav, ki temelji na kanalih, zaradi česar je primeren za uporabo v peer-to-peer aplikaciji, kot je sistem sodelovanja.

Uporaba Message Bus v odjemalski aplikaciji

Ti koraki omogočajo odjemalcu, da uporablja vodilo sporočil:

  1. Nastavite primerek MessageBus.

     Channel.setMessageBus (novo MessageBusSocketImpl (BROKER_NAME, BROKER_PORT)); 

    V tem razpisu novo MessageBus Ustvari se izvedba, posrednik pa se identificira z argumenti klica konstruktorja.

  2. Naročite se na kanal.

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

    Ta klic vrne primerek kanala, ki ustreza argumentu imena kanala. Če kanal ne obstaja, se ustvari v sistemu.

    Mimo to kot argument pomeni, da je klicatelj sam a ChannelListener. Kličoči se lahko naroči ne samo na sebe, ampak tudi na katerega koli drugega ChannelListener na kanal ali poljubno število poslušalcev na enem kanalu.

  3. Objavite sporočilo v kanalu.

     textChannel.publish (nov niz (myID + "pozdravljen!")); 

    Objava sporočila je enostavna in ne vključuje samo klica objavi () na izbranem primerku kanala. Sporočilo je lahko katere koli vrste predmeta, če ga lahko razumejo drugi odjemalci na kanalu in ima strežnik dostop do datotek razreda sporočil (kot je podrobno opisano v razdelku Uporaba vodila sporočil)

Dodatni neobvezni koraki vključujejo:

  • Odjavite poslušalca s kanala.

     textChannel.unsubscribe (ChannelListener); 

    Ta metoda odjavi imenovano ChannelListener s kanala, kar pomeni, da poslušalec ne bo prejel novih sporočil. Poslušalce je treba na ta način odjaviti, ko niso več potrebni.

  • Pridobite seznam imen kanalov.

     Enumeration Channel.getChannelNames (); 

    Ta metoda vrne imena vseh kanalov, ki so na voljo na sporočilnem vodilu.

  • Naročite se na prejemanje novo dodanih kanalov.

     Channel.subscribeChannelsUpdate (ChannelsUpdateListener); 

    A ChannelsUpdateListener se lahko naročite na prejemanje posodobitev, ko so kanali dodani v Message Bus.

  • Nehajte prejemati novo dodane kanale.

     Channel.unsubscribeChannelsUpdate (ChannelsUpdateListener); 

    A ChannelsUpdateListener se lahko odjavite iz posodobitev dodajanja kanalov. Poslušalce je treba na ta način odjaviti, ko niso več potrebni.

  • V kanal dodajte več poslušalcev.

     textChannel.subscribe (ChannelListener); 

    Ta metoda omogoča kličočemu, da na kanal naroči dodatne poslušalce.

     String textChannel.getName (); 

    Ta metoda vrne ime tega primerka kanala.

Vmesnik ChannelListener

The ChannelListener vmesnik mora implementirati kateri koli objekt, ki ga želite posodobiti, ko pride sporočilo na določen kanal.

javni vmesnik ChannelListener {public void messageReceived (Channel channel, Object message); } 

V večini primerov stranka, ki prosi za Kanal Primer se bo naročil na kanal in sam implementiral ta vmesnik, vendar to ni potrebno. V skladu z vmesniki dogodkov JDK 1.1 lahko odjemalec na kanal naroči drug predmet, tako da bo porabil sporočila, ki jih ustvari kanal.

Dejansko se lahko en sam objekt poslušalca naroči na več kanalov, ki bodo poklicali poslušalca messageReceived () vsakič, ko pride sporočilo na katerem koli kanalu. The messageReceived () klic metode omogoča dostop do kanala, kjer se je pojavilo sporočilo, kar omogoča messageReceived () da ločite sporočila po izvornem kanalu.

Vmesnik ChannelsUpdateListener

ChannelsUpdateListener mora izvajati kateri koli objekt, ki ga želi posodobiti ob dodajanju kanala.

javni vmesnik ChannelsUpdateListener {public void channelAdded (ime niza); } 

Razred Kanal

The Kanal razred služi dvema namenoma:

  • Omogoča preprosto abstrakcijo kot vmesnik do odjemalca z uporabo Message Bus
  • Vzdržuje globalno stanje razpoložljivih kanalov in prenaša sporočila s kanalov na MessageBus in prejema posodobitve od MessageBus izvajanje

Kanal primerke ustvari in shrani Kanalstatična koda. Sklice nanje je dal Channel.subscribe () kot zahteva stranka. Vsak Kanal primera je edinstven v procesu JVM.

javni razred Channel {

zaščiten statični logični busSet = false; zaščiteno statično vodilo MessageBus; zaščiteni statični Hashtable kanali = new Hashtable (); zaščiteni statični vektorski kanaliUpdateListeners = nov vektor ();

javna statična sinhronizirana praznina setMessageBus (MessageBus mb) vrže IOException {if (! busSet) {bus = mb; bus.initBroker (); busSet = true; } else System.out.println ("MessageBus ni mogoče nastaviti več kot enkrat na izvajanje!"); }

javni statični niz getBrokerName () {return bus.getBrokerName (); }

javno statično štetje getChannelNames () {return channels.keys (); }

Te metode razreda omogočajo MessageBus primerek, ki se nastavi enkrat za vsako izvajanje, in vrne informacije o vodilih oziroma imenih kanalov.

 javna statična sinhronizirana naročnina na kanal (ime niza, ChannelListener cl) vrže IOException {Channel ch; if (channel.containsKey (name)) ch = (Channel) channels.get (name); else {bus.addChannel (ime); ch = nov kanal (ime); channel.put (ime, ch); } ch.subscribe (cl); vrnitev ch; } 

Ta metoda razreda vrne primerek kanala, ki ustreza imenu kanala. Ustvari kanal in klice MessageBus da ga dodate v sistem, če še ne obstaja. Takoj ko je kanal ustvarjen, se z njim registrira njegov začetni poslušalec.

// pokličejo odjemalci, da se registrirajo ChannelsUpdateListener public static void subscribeChannelsUpdates (ChannelsUpdateListener cul) {channelsUpdateListeners.addElement (cul); }

// pokličejo odjemalci, da odjavijo ChannelsUpdateListener javno statično void unsubscribeChannelsUpdates (ChannelsUpdateListener cul) {channelUpdateListeners.removeElement (cul); }

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