Ziņojumu rinda

**Ziņojumu rinda** () jeb **ziņojumu rindošanas sistēma** ir programminženierijas komponente, ko izmanto starpprocesu komunikācijai  vai starppavedienu saziņai tajā pašā procesā. Tā nodrošina asinhronas saziņas protokolu, kurā ziņojumu sūtītājam un saņēmējam nav nepieciešams vienlaicīgi mijiedarboties — ziņojumi tiek turēti rindā, līdz adresāts tos iegūst.
Ziņojumu rindas tiek izmantotas operētājsistēmās vai lietojumprogrammās, lai programmas varētu savstarpēji sazināties. Tās var izmantot arī ziņojumu nodošanai starp datorsistēmām.

Ziņojumu rindas paradigma ir līdzīga “publicēšana — abonēšana” modelim, un tā parasti ir daļa no lielākas uz ziņojumiem orientētas starpprogrammatūras sistēmas. Vairums ziņojumapmaiņas sistēmu savā lietojumprogrammas saskarnē (*API*) atbalsta gan ziņojumu rindas, gan “publicēšana — abonēšana” modeļus, piemēram, *[[Java Message Service]]* (*JMS*).

## Pārskats
Ziņojumu rindas nodrošina asinhrono sakaru protokolu, kas nozīmē, ka ziņojuma sūtītājam un saņēmējam vienlaikus nav jāmijiedarbojas ar ziņojumu rindu. Ziņojumi, kas atrodas rindā, tiek saglabāti, līdz adresāts tos iegūst. Ziņojumu rindām ir netieši vai skaidri ierobežojumi attiecībā uz datu apjomu, ko var pārraidīt vienā ziņojumā, un uz ziņojumu skaitu, kas var palikt neizpildīti rindā.

Daudzas ziņojumu rindu realizācijas funkcionē iekšēji: operētājsistēmā vai lietojumprogrammā. Šādas rindas pastāv tikai šīs sistēmas vajadzībām.

Citas realizācijas ļauj nosūtīt ziņojumus starp dažādām datorsistēmām, potenciāli savienojot vairākas lietojumprogrammas un vairākas operētājsistēmas. Šīs ziņojumu rindošanas sistēmas parasti nodrošina uzlabotu elastīguma funkcionalitāti, lai nodrošinātu, ka ziņojumi sistēmas kļūmes gadījumā netiek “zaudēti”.

Ziņojumu rindas realizācija var būt kā īpašniekprogrammatūra, atvērtā pirmkoda programmatūra, aparatūras risinājums vai kā pakalpojums.
Īpašniekprogrammatūrai ir visgarākā vēsture, un tāda ir, piemēram, *[[IBM MQ]]*; ir produkti, kas saistīti ar noteiktām operētājsistēmām, piemēram, *[[Microsoft Message Queuing]]*.

Ziņojumu rindas komerciālas programmatūras piemēri ir *[[IBM MQ]]* un *[[Oracle Advanced Queuing]]* (*AQ*). Pastāv *Java* standarts *[[Java Message Service]]*, kam ir vairākas maksas un bezmaksas programmatūras realizācijas.

Ir daudzas atvērtā pirmkoda uz ziņojumiem orientētas starpprogrammatūras sistēmas, piemēram, *[[Apache ActiveMQ]]*, *[[Apache Kafka]]*, *[[Apache Qpid]]*, *[[Apache RocketMQ]]*, *[[Beanstalkd]]*, *[[Enduro/X]]*, *[[HTTPSQS]]*, *[[JBoss Messaging]]*, *[[JORAM]]*, *[[RabbitMQ]]*, *[[Sun Open Message Queue]]* un *[[Tarantool]]*.

Eksistē arī uz aparatūras bāzes veidotas ziņojumu apmaiņas sistēmas, kur programmatūra ir ierakstīta pusvadītāju atmiņā. Tādas ierīces piegādā, piemēram, *[[Solace]]*, *[[Apigee]]* un *[[Tervela]]*. *IBM* arī ierīcēm piedāvā savu *MQ* programmatūru.

Arvien populārākas kļūst mākoņdatošanas ziņojumu rindu pakalpojumu iespējas, piemēram, *[[Amazon Simple Queue Service]]*, *[[StormMQ]]* un *[[IronMQ]]*.

Lielākā daļa reāllaika operētājsistēmu (RLOS), piemēram, *[[VxWorks]]* un *[[QNX]]*, veicina ziņojumu rindošanas izmantošanu kā primāro starpprocesu vai starppavedienu saziņas mehānismu. No tā izrietošā ciešā integrācija starp ziņojumu apmaiņu un centrālā procesora plānošanu tiek uzskatīta par galveno iemeslu RLOS izmantojamībai reāllaika lietojumprogrammās. *[[Erlang]]* programmēšanas valoda izmanto procesus, lai nodrošinātu vienlaicīgumu; šie procesi sazinās asinhroni, izmantojot ziņojumu rindošanu.

## Izmantošana
Tipiskā ziņojumu rindošanas sistēmas realizācijā sistēmas administrators uzstāda un konfigurē ziņojumu rindošanas programmatūru un definē nosaukto ziņojumu rindu.
Pēc tam lietojumprogramma reģistrē programmatūras rutīnu, kas “klausās” ziņojumus, kas tiek ievietoti rindā.

Sekundārās un citas lietojumprogrammas var izveidot savienojumu ar rindu un pārsūtīt ziņojumu uz to.

Rindas pārvaldības programmatūra saglabā ziņojumus, līdz saņemošā programma izveido savienojumu un pēc tam izsauc reģistrēto programmatūras rutīnu. Pēc tam saņemošā lietojumprogramma apstrādā ziņojumu atbilstošā veidā.

Faktori, kas var būtiski ietekmēt transakcijas semantiku, sistēmas uzticamību un sistēmas efektivitāti:
* Ilgmūžība — ziņojumi var tikt glabāti atmiņā, rakstīti diskā vai pat nodoti datubāzes pārvaldības sistēmā, ja uzticamības nepieciešamība liecina par resursu ietilpīgāku risinājumu
* Drošības politika — nosaka, kurām lietojumprogrammām ļaut piekļuvei šiem ziņojumiem
* Ziņojumu tīrīšanas politika — rindām vai ziņojumiem var būt dzīvlaiks
* Ziņojumu filtrēšana — dažas sistēmas atbalsta datu filtrēšanu, lai abonents varētu skatīt tikai tos ziņojumus, kas atbilst dažiem iepriekš noteiktiem kritērijiem
* Piegādes politika — nosaka, vai ir jāgarantē, ka ziņojums tiek piegādāts vismaz vienu reizi, tieši vienu reizi vai arī ne vairāk kā vienu reizi
* Maršrutēšanas politika — sistēmā ar daudziem rindu serveriem nosaka, kuros serveros ir jāsaņem ziņojums vai rindas ziņojumi
* Paketēšanas politika — nosaka, ka ziņa jānogādā nekavējoties, vai arī sistēmai vajadzētu mazliet pagaidīt un mēģināt vienā reizē nogādāt daudzus ziņojumus
* Rindošanas kritērijs — nosaka, kad ziņojums ir jāuzskata par “ieliktu rindā”. Kad tas ir vienā rindā? Vai tad, kad tas ir pārsūtīts uz vismaz vienu attālo rindu? Vai uz visām rindām?
* Paziņojums par saņemšanu — izdevējam, iespējams, ir jāzina, kad daži vai visi abonenti ir saņēmuši ziņojumu.

## Standarti un protokoli
Vēsturiski ziņojumu rindošanā tika izmantoti īpašnieka, slēgti protokoli, kas ierobežoja dažādu operētājsistēmu vai programmēšanas valodu spēju mijiedarboties heterogēnās vidēs.

Agrīns mēģinājums padarīt ziņojumu rindošanu sakārtotāku bija *[[Sun Microsystems]]* *JMS* specifikācija, kas nodrošināja tikai *Java* klienta *API* abstrakciju. Tas ļāva *Java* izstrādātājiem pārslēgties starp ziņojumu rindošanas nodrošinātājiem līdzīgi kā izmantojot *[[SQL]]* datu bāzes. Praksē, ņemot vērā rindošanas metožu un scenāriju dažādību, tas ne vienmēr bija tik praktisks, kā varētu būt.

Daži populārākie standarti, ko izmanto atvērtā pirmkoda ziņojumu rindas realizācijā:
* *[[Advanced Message Queuing Protocol]]* (*AMQP*) – iespējām bagāts ziņojumu rindas protokols, kas 2014. gada aprīlī apstiprināts kā *ISO/IEC 19464*
* *[[Streaming Text Oriented Messaging Protocol]]* (*STOMP*) — vienkāršs, uz tekstu orientētu ziņojumu protokols

Šie protokoli darbojas tādā pašā līmenī kā *[[HTTP]]*. Dažas īpašniekprogrammatūras realizācijas arī izmanto *HTTP*, lai nodrošinātu ziņojumu rindošanu, piemēram, *Amazon SQS*.

## Atsauces