Šis raksts ir par programmatūru. Par citām jēdziena **MOM** nozīmēm skatīt nozīmju atdalīšanas lapu.
**Ziņojumapmaiņas starpprogrammatūra** (angļu: *Message-oriented middleware*; ***MOM***) ir starpprogrammatūra vai aparatūras infrastruktūra, kas atbalsta ziņojumapmaiņu starp dalītajām sistēmām. Tā galvenokārt paredzēta ziņojumu sūtīšanai asinhronā veidā, savukārt vienranga tīkls un attālinātie izsaukumi darbojas sinhronā režīmā.

*MOM* ļauj programmu moduļus izvietot uz neviendabīgām platformām (dažādas operētājsistēmas un tīkla protokoli) un samazināt lietojumprogrammu izstrādes sarežģītību. Starpprogrammatūra izveido dalītu sakaru slāni, kas izolē lietojumprogrammas izstrādātāju no dažādu operētājsistēmu un tīkla interfeisu detaļām.

Šis starpprogrammatūras slānis ļauj izmantot programmatūras komponentus (lietojumprogrammas, *Enterprise JavaBeans*, servletus un citus komponentus), kas ir izstrādāti neatkarīgi un darbojas dažādās tīkla platformās, lai savstarpēji mijiedarbotos. Programmas, kas izplatītas dažādos tīkla mezglos, izmanto programmas interfeisu, lai sazinātos. Turklāt, nodrošinot administratīvu saskarni, šo jauno, virtuālo savstarpēji savienoto lietojumprogrammu sistēmu var padarīt uzticamu un drošu.

Modeļi
------

Ziņojumapmaiņas starpprogrammatūra var būt realizēta kā:

* ziņojumu rinda;
* publicēšana — abonēšana.

Vienā starpprogrammatūras sistēmā var būt apvienoti arī abi modeļi.

Atšķirības no citām starpprogrammatūras kategorijām
---------------------------------------------------

Ziņojumapmaiņas starpprogrammatūrai līdzīgas starpprocesu sakaru starpprogrammatūras kategorijas ir attālie procedūras izsaukumi (*RPC*) un objektu pieprasījuma starpnieki (*ORB*). 

Visi šie modeļi ļauj vienam programmatūras komponentam ietekmēt cita komponenta darbību tīklā. Tās atšķiras ar to, ka *RPC* un *ORB* bāzēta starpprogrammatūra rada cieši saistītu komponentu sistēmas, bet *MOM* bāzētas sistēmas nodrošina komponentu vājāku sasaisti. *RPC* un *ORB* sistēmā, kad viena procedūra izsauc citu, ir jāgaida, līdz tiek atgriezta izsauktā procedūra, pirms tā var paveikt ko citu. Šajos sinhrono ziņojumapmaiņas modeļos starpprogrammatūra daļēji darbojas kā supersavienotājs, atrodot izsaukto procedūru tīklā un izmantojot tīkla pakalpojumus, lai nodotu funkcijas vai metodes parametrus procedūrai un pēc tam atgrieztu rezultātus.

Priekšrocības
-------------

Galvenie iemesli, kāpēc tiek izmantots uz ziņojumiem balstīts sakaru protokols, ir tā spēja saglabāt (buferis), maršrutēt vai transformēt ziņojumus, tos no sūtītājiem nogādājot saņēmējiem.

Vēl viena ziņapmaiņas nodrošinātāja priekšrocība ir tā, ka, pievienojot administratīvo interfeisu, var pārraudzīt un regulēt veiktspēju. Tādējādi klientu lietojumprogrammas tiek efektīvi atbrīvotas no visām problēmām, izņemot ziņojumu sūtīšanu, saņemšanu un apstrādi. Tādas problēmas kā sadarbspēja, uzticamība, drošība, mērogojamība un veiktspēja *MOM* sistēmā ir administratora ziņā.

### Asinhroniskums

Izmantojot *MOM* sistēmu, klients veic lietojumprogrammas saskarnes (*API*) izsaukumu, lai sūtītu ziņojumu uz pakalpojumu sniedzēja pārvaldītu adresātu. Izsaukums lūdz pakalpojumu sniedzēju, lai tas maršrutētu un piegādātu ziņu. Kad ziņojums ir nosūtīts, klients var turpināt veikt citus darbus, pārliecībā, ka pakalpojumu sniedzējs saglabā ziņojumu, līdz saņemošais klients to iegūst. Uz ziņojumiem balstītais modelis kopā ar pakalpojuma sniedzēja starpniecību ļauj izveidot vaļīgi saistītu komponentu sistēmu.

Ziņojumapmaiņas starpprogrammatūra ietver dažādu lietojumprogrammu saziņas programmatūras kategoriju, kas parasti balstās uz asinhronas ziņojumu apmaiņas, nevis uz pieprasījumu un atbilžu arhitektūru. Asinhronās sistēmās ziņojumu rindas nodrošina pagaidu krātuvi, ja mērķa programma ir aizņemta vai nav savienojuma. Turklāt lielākā daļa asinhrono *MOM* sistēmu nodrošina pastāvīgu krātuvi ziņojumu rindas rezerves kopijai. Tas nozīmē, ka sūtītājam un saņēmējam nav nepieciešams vienlaikus izveidot savienojumu ar tīklu (asinhronā piegāde) un problēmas ar intermitējošo savienojamību ir atrisinātas. Tas nozīmē arī to, ka gadījumā, ja uztvērēja lietojumprogramma kāda iemesla dēļ nedarbojas, sūtītāji var turpināt neietekmēto darbību, jo nosūtītie ziņojumi vienkārši uzkrāsies ziņojumu rindā vēlākai apstrādei, kad saņēmējs tiks pārstartēts.

### Maršrutēšana

Daudzas ziņojumapmaiņas starpprogrammatūras realizācijas ir atkarīgas no ziņojumu rindas sistēmas. Dažas realizācijas ļauj maršrutēšanas loģiku nodrošināt pašam ziņojumapmaiņas slānim, bet citas ir atkarīgas no klientu lietojumprogrammām, lai sniegtu maršruta informāciju vai ļautu kombinēt abas paradigmas. Dažās realizācijas izmanto apraides vai multiraides izplatīšanas paradigmas.

### Pārveidošana

Ziņojumapmaiņas starpprogrammatūras sistēmā adresātam saņemtajam ziņojumam nav jābūt identiskam ar sākotnēji nosūtīto ziņojumu. *MOM* sistēma ar iebūvētu loģiku maršrutā var pārveidot ziņojumus, lai tie atbilstu sūtītāja vai saņēmēja prasībām. Saistībā ar maršrutēšanas un apraides / multiraides iespējām viena lietojumprogramma var nosūtīt ziņojumu savā dabīgajā formātā, un divas vai vairākas citas lietojumprogrammas var saņemt ziņojuma kopiju savā dabīgajā formātā. Daudzas modernas *MOM* sistēmas nodrošina sarežģītus ziņojumu pārveidošanas (vai kartēšanas) rīkus, kas ļauj programmētājiem norādīt transformācijas noteikumus, kas piemērojami vienkāršai GUI vilkšanas un nomešanas darbībai.

Trūkumi
-------

Daudzu ziņojumapmaiņas starpprogrammatūras sistēmu galvenais trūkums ir tas, ka tām ir nepieciešama papildu komponente arhitektūrā — ziņojumu pārsūtīšanas aģents (starpnieks). Tāpat kā jebkurā citā sistēmā, arī citas sastāvdaļas pievienošana var samazināt veiktspēju un uzticamību, kā arī sarežģīt sistēmas uzturēšanu kopumā.

Turklāt daudziem starplietotņu sakariem ir iepriekšdefinēts sinhrons aspekts, jo sūtītājs īpaši vēlas gaidīt atbildi uz ziņojumu, pirms turpināt (sk. reāllaika skaitļošanu un gandrīz reāllaiku ārkārtējiem gadījumiem). Tā kā ziņojumapmaiņas saziņa parasti darbojas asinhroni, šādās situācijās tā var īsti neatbilst asinhronajam principam. Vairumam *MOM* sistēmu tomēr ir iespējas sagrupēt pieprasījumu un atbildi kā vienu pseidosinhronu transakciju.

Izmantojot sinhrono ziņojumapmaiņas sistēmu, zvanīšanas funkcija neatgriežas, kamēr izsauktā funkcija nav pabeigusi savu uzdevumu. Vaļīgi savienotā asinhronajā sistēmā zvanīšanas klients var turpināt ielādēt darbu adresātam, līdz resursi, kas nepieciešami šī darba veikšanai, ir iztērēti un izsauktais komponents pārstāj darboties. Protams, šādus apstākļus var samazināt vai novērst, uzraugot veiktspēju un pielāgojot ziņojumu plūsmu, bet tas ir darbs, kas nav nepieciešams sinhronā ziņojumapmaiņas sistēmā. Svarīgākais ir saprast katra veida sistēmas priekšrocības un saistības. Katra sistēma ir piemērota dažāda veida uzdevumiem. Dažreiz, lai iegūtu vēlamo uzvedību, ir nepieciešama divu veidu sistēmu kombinācija.

Standarti
---------

Sākotnēji nebija standartu, kas regulētu ziņojumapmaiņas starpprogrammatūras izmantošanu, kas ir radījusi problēmas. Lielākajai daļai galveno piegādātāju ir savas realizācijas, katram no tiem ir savs lietojumprogrammu programmēšanas interfeiss (API) un pārvaldības rīki.

Viens no ilgāk pastāvējušajiem standartiem ziņojumapmaiņas starpprogrammatūrai ir *X/Open* grupas *XATMI* specifikācija (*Distributed Transaction Processing: The XATMI Specification*), kas standartizē starpprocesu sakaru *API*. Zināmākās šī *API* realizācijas ir *Oracle* *Tuxedo* un Latvijas uzņēmuma *Mavimax* *Enduro/X* starpprogrammatūra.

*Advanced Message Queuing Protocol* (*AMQP*) ir *OASIS* un *ISO* apstiprināts standarts, kas definē protokolu un formātus, ko izmanto starp iesaistītajām lietojumprogrammas komponentēm. *AMQP* var izmantot ar elastīgām maršrutēšanas shēmām, tostarp ar tādām vispārīgām ziņojumapmaiņas paradigmām kā no punkta līdz punktam, izejsazarotība, publicēšana — abonēšana un pieprasīšana — atbildēšana.

*High-Level Architecture* (*HLA IEEE 1516*) ir *IEEE* un *SISO* standarts dalītās simulācijas savstarpējai izmantojamībai. Tas definē pakalpojumu kopu, kas tiek sniegta, izmantojot *API*, kas rakstīts *C++* vai *Java*. Pakalpojumi piedāvā publicēt — abonēt informācijas apmaiņu, pamatojoties uz modulāru *Federation Object Model*. Pastāv arī pakalpojumi koordinētai datu apmaiņai un laika celšanai, pamatojoties uz loģisko simulācijas laiku, kā arī sinhronizācijas punktiem. Papildu pakalpojumi nodrošina īpašumtiesību nodošanu, datu izplatīšanas optimizāciju un iesaistīto sistēmu uzraudzību un pārvaldību.

*MQTT* ir *ISO* standarts *(ISO/IEC PRF 20922*), ko atbalsta *OASIS* organizācija. Tas nodrošina vieglu "publicēšana — abonēšana" uzticamu ziņapmaiņas transporta protokolu virs *TCP/IP*. Tas ir piemērots mašīna mašīnai (*M2M*) un lietu interneta risinājumos, ierīcēm ar ierobežotu atmiņas apjomu vai zemu datu pārraides ātrumu vai nestabilu sakaru kanālu.

*Object Management Group* *Data Distribution Service* (*DDS*) nodrošina uz ziņojumiem orientētu "publicēšana — abonēšana" starpprogrammatūras standartu, kā mērķis ir nodrošināt mērogojamu, reāllaika, uzticamu, augstas veiktspējas un savstarpēji izmantojamu datu apmaiņu starp izdevējiem un abonentiem. Standarts nodrošina saskarnes ar *C++*, *C++11*, *C*, *Ada*, *Java* un *Ruby*.

*XMPP* ir ziņojumapmaiņas starpprogrammatūras saziņas protokols, kura pamatā ir *XML*. Protokols ir izstrādāts, lai to varētu paplašināt. To var izmantots ne tikai "publicēšana — abonēšana" sistēmām, bet arī signalizācijai *VoIP*, video, failu pārsūtīšanai, spēlēšanai, lietu internetam, un sociālo tīklu pakalpojumiem.

*Java EE* programmēšanas vide nodrošina standarta *API* *Java Message Service* (*JMS*). Tā atbalsta modeļus "no punkta līdz punktam" (ziņojumu rinda) un "publicēšana — abonēšana".