Message Oriented Middleware (MOM) Thomas Filip Andresen Arild Berggren Eivind Bøhn
Agenda Hva er MOM? Hva er JMS? Hvordan kan MOM brukes i praksis?
Hva er MOM? Message Oriented Middleware Sende meldinger mellom komponenter ved hjelp av mellomvare Meldinger legges i køer, og komponentene prater med hverandre ved å skrive til og lese fra disse køene.
Hva er MOM? Kommunikasjonen er asynkron Meldinger kan køes opp, og prosesseres ved kapasitet Mottakerkomponenten trenger ikke være operativ i det meldingen blir sendt fra avsender. Køer kan være persistente Meldinger blir ikke tapt ved uforutsette hendelser Køer gjør distribusjon enklere Avsendere/mottakere/køer kan være plassert på forskjellige lokasjoner og plattformer Meldinger kan også kringkastes til flere mottakere
Ulemper ved MOM Meldingsutveksling er kun asynkron Mange systemer krever synkronisering Vanskelig å garantere leveringstid Økt overhead Spesielt ved persistente køer Flere komponenter gir økt kompleksitet Få standarder JMS i Java
Hva er JMS? Java Messaging Service Java sin spesifikasjon av MOM Et API for å sende meldinger mellom to eller flere komponenter Flere forskjellige implementasjoner Implementerer samme API, men noen gir tilleggsfunksjonalitet JBossMQ - en del av JBoss, open source ActiveMQ - open source SonicMQ - kommersiell Sun Java System Message Queue - kommersiell
JMS og køer JMS har to typer køer Queues Flere kan sende meldinger til en kø og en mottar meldingen (unicast). (Flere kan lytte på samme kø) Topics Flere kan sende meldinger til et topic og alle som lytter på topic et får meldingen (broadcasting) Køer kan være persistente Meldingene lagres normalt i en database
JMS har tre typer meldinger TextMessage Inneholder en tekst streng MapMessage Inneholder en rekke nøkkelord med tilhørende verdier (Map) ObjectMessage Inneholder et serialiserbart (Serializable) objekt
Hvordan definere en kø Dette er leverandøravhengig. I JBoss deployes en fil med navn ettellerannet-service.xml og med følgende innhold: <?xml version="1.0" encoding="utf-8"?> <server> <mbean code="org.jboss.mq.server.jmx.queue" name="jboss.mq.destination:service=queue, name=examplequeue"> <depends optional-attribute-name="destinationmanager"> jboss.mq:service=destinationmanager </depends> </mbean> </server>
Hvordan sende til en kø
Hvordan lytte på en kø
Fordeler/ulemper ved JMS Godt utbredt standard i Java-verdenen Mange implementasjoner å velge imellom Mye kode for å sende en melding til en kø Baserer seg på Casting -> Feil oppdages ved RunTime og ikke ved kompilering Jboss har foreslått en løsning på dette, som enda ikke er en del av standarden: http://docs.jboss.org/ejb3/appserver/tutorial/consumer/consumer.html
Hvordan kan MOM brukes i praksis? Scenario: SMS-tjenester
SMS-tjenester - tall og fakta Norge i verdenstoppen på SMS-forbruk 4 meldinger/person/dag ca. 150 meldinger/sekund i snitt Idol-finalen da Kurt Nilsen vant: 939 523 meldinger I USA mistes ca. 10% (2003) av alle tekstmeldinger Stort marked og mange operatører og standarder
SMS-tjenester: Karakteristika Asynkron meldingsflyt Ingen garanti for når meldingen kommer fram Distribuert arkitektur Mange systemer og parter involvert Store svingninger i trafikkvolum Nyttårsaften, Idol,... Viktig å ikke miste meldinger Selvangivelsen, bankoverføringer, autentisering, betaling
MOM i praksis
Fordeler ved å bruke MOM Kommunikasjonslaget ferdig utviklet Utvikler trenger kun å fokusere på logikken til komponentene Enkelt å håndtere en distribuert arkitektur God håndtering av topper i trafikkvolum Meldinger blir ikke borte ved uventet avbrudd Uavhengighet mellom komponenter Deler av systemet kan være midlertidig nede Mottakerkomponent trenger ikke være aktiv når avsender sender en melding Hot deploy Skalerbarhet
Ulemper ved å bruke MOM Mye overhead Hver eneste melding forårsaker databaseforespørsler ved persistente køer Vanskelig å garantere at meldinger blir levert innen en gitt tid