Enduro/X

***Enduro/X*** ir atvērtā pirmkoda ziņojumapmaiņas starpprogrammatūras platforma starpprocesu sakaru (*interprocess communication*, *IPC*) nodrošināšanai. Platforma ir paredzēta reāllaika mikropakalpojumu lietojumprogrammu izveidei, izmantojot klasterizācijas iespēju, kas ļauj savienot divas vai vairākas instances vienādranga veidā.
Projektu attīsta Latvijas uzņēmums SIA *Mavimax*.

*Enduro/X* izmanto atmiņā uzturētas *[[POSIX]]* vai *[[System V]]* kodola rindas, kas nodrošina augstu transakciju caurlaidspēju starp procesiem un starp serveriem.
Platforma izpildlaika sistēmās ļauj uzlikt ielāpus bez pakalpojuma pārtraukuma. Sistēma pārrauga procesus un restartē tos pēc avārijas vai pakarināšanas. Sistēmas konfigurāciju var dinamiski pārlādēt.

*Enduro/X* ir rakstīta *[[C (programmēšanas valoda)|C]]* valodā un nodrošina *C* un *C++* dabiskos lietojumprogrammu saskarnes (*API*). 
Sistēmas pamatā ir sevi pierādījuši *API*, piemēram, *X/Open* grupas *XATMI* un *XA*. *Enduro/X* ir *[[Oracle (uzņēmums)|Oracle]]* *[[Tuxedo]]* paplašināts aizstājējs.

## Vēsture
*Enduro/X* izstrāde tika sākta 2009. gadā. Tas bija slēgta pirmoda projekts Latvijas uzņēmumā SIA *ATR Baltic*. Pirmie klienti (galvenokārt bankas) tika iekļauti sistēmā 2012. gada beigās, kad *Enduro/X* sasniedza versiju 1.0.

Projekta pirmkods tika atvērts 2015. gadā ar versiju v2.3.2. No tā brīža visa izstrāde kļuva pieejama publiski. Līdz versijai 6.0 *Enduro/X* bija pieejams ar licenci *GNU GPLv2*, bet sākot ar 6.0 versiju projekts tika izlaists ar *GNU AGPLv3* licenci.

2017. gada februārī *ATR Baltic* *Enduro/X* projektu pārdeva SIA *Mavimax* ar pilnām tiesībām uz pirmkodu un noslēgtajiem līgumiem.

## Tehnoloģija
Sākot no 2.6.12 versijas, *Enduro/X* darbojas uz ''Linux'' kodoliem. Viskritiskākā *Linux* iezīme ir *epoll()* *[[POSIX]]* rindās. Šī *Linux* funkcionalitāte nodrošina mehānismu "viena rinda — vairāki serveri", kur *Enduro/X* serveri aptaujā rindas. *Enduro/X* izstrādātāji panāca *EPOLLEXCLUSIVE* karoga iekļaušanu *Linux* kodolā (sākot ar versiju 4.5). Ielāps uzlaboja *Enduro/X* atbildi gadījumā, ja simtiem izpildītāju sniedz vienu un to pašu pakalpojumu. Īpaši kodols vairs neraisa "ganāmpulka" tipa uzvedību, sākot darboties visiem rindā gaidošajiem binārajiem kodiem. Tagad tiek pamodināts tikai viens pakalpojuma izsaukuma uztvērējs. Dažās darba slodzēs *Enduro/X* lietojumprogrammas saņem ievērojamu pastiprinājumu. Testa pārbaudēs ielāps palielināja darba slodzes veiktspēju no 860 sekundēm līdz 24 sekundēm.

Sākot ar *Enduro/X* versiju 3.1.2 tika pievienots atbalsts *[[FreeBSD]]*, *[[IBM AIX]]* (6.1 un 7.1 versija) un *[[Oracle Solaris]] V11*. Versijā 3.1.2 tika ieviests eksperimentāls atbalsts Apple *[[macOS]]* un *[[Cygwin]]*. *Unix* platformā, kur ir pieejamas *Posix* rindas, tās tiek izmantotas tā, lai katram *ATMI* servera un servisa pārim būtu atvērta atsevišķa rinda, un zvanītāja pakalpojums izvēlētos rindu apļkārtes režīmā. Tā kā *MacOS* operētājsistēmā nav atbalsta *Posix* rindā, *Enduro/X* izmanto emulētas *Posix* rindas, kuru pamatā ir atmiņas kartēti faili tandēmā ar *Posix* pavediena procesa koplietotiem mutesiem. *FreeBSD* arī var aptaujāt *Posix* rindas, tādējādi *Enduro/X* uz *FreeBSD* darbojas kā *Linux* ar "viena rinda — vairāki serveri" (*SQMS*) ziņojumu izplatīšanas pieeju. *FreeBSD* aptauja tiek veikta ar *kqueue* palīdzību.

Ar versiju 6.0 *IPC* mehānismu vietā tiek izmantotas *[[System V]]* rindas *Unix* platformām, izņemot *FreeBSD* un *Linux*. *System V* rinda arī nodrošina "viena rinda — vairāki serveri" efektīvai slodzes līdzsvarošanai. Lai ielādētu līdzsvaru *SQMS* režīmā ar *System V* rindām,* XATMI* serveris ir jākonfigurē, lai izmantotu pieprasījuma adresi (loģiskais kanāls / rinda), kurā visi *XATMI* serveri reklamē vienus un tos pašus pakalpojumus. Šis rindas režīms ir pieejams *Oracle Solaris* un *IBM AIX*. *MacOS* joprojām tiek izmantota emulētā *Posix* rinda.

## Īpašības
* Uz standartiem balstīti *API* -— *[[Service Component Architecture|SCA]]*, *[[The Open Group]]* *XATMI*
* Saziņas veidi: sinhrons, asinhrons, dialogrežīms, publicēt — abonēt
* Rakstīšanas buferi
** *UBF* (*Unified Buffer Format*), kas nodrošina *Tuxedo* *FML/FML32* formāta emulēšanu; tas ir augstas veiktspējas binārā protokola buferformāts. Buferis tiek indeksēts, izmantojot bināro meklēšanu fiksētiem datu tipiem.
** *STRING* (teksta) bufera formāts
** *CARRAY* (baitu masīva) bufera formāts
** *[[JSON]]* bufera formāts; pieejama automātiska formāta pārvēršana starp *JSON* un *UBF*
** *VIEW* buferi (sākot ar versiju 5.0+). Tas paredzēts *C* struktūras sūtīšanai starp procesiem starpplatformu veidā. Tas ļauj arī kartēt *UBF* laukus uz *VIEW* laukiem, tādējādi palīdzot izstrādātājiem ātrāk izstrādāt lietojumprogrammas, kombinējot *UBF* un *VIEW* buferus.
* Transakciju pārvaldība — globālās transakcijas — divfāzu izpildes protokols *[[X/Open XA]]*
* Klasteru veidošana – pēc vienādranga principa
* Notikumu brokeris (tiek saukts arī par "publicēšana — abonēšana" ziņapmaiņu)
* Drošība — klastera saites šifrēšana ar *GNU [[Pretty Good Privacy|PGP]]* struktūru
* Sistēmas procesa monitorings un pašdziedēšana (pingi un restarti)
* *SOA Service* kešatmiņa. *XATMI* pakalpojumus var iekešot *[[LMDB]]* datubāzē. Tādējādi nākamais pakalpojuma izsaukums no jebkura vietējā klienta saņem rezultātus tieši no kešatmiņas (galvenokārt no tiešās atmiņas nolasīšanas).
* Dinamiskā pārkonfigurēšana
* Pielāgoti servera aptaujas paplašinājumi
* *XATMI* apakšsistēma spēj strādāt bez galvenā lietojumprogrammu servera dēmona (*ndrxd*)
* Galveno lietojumprogrammu servera dēmonu (*ndrxd*) var restartēt (ja tas ir bojāts). Startējot tas kādu laiku ieiet mācību režīmā, apkopojot informācija par sistēmu, par to, kādi pakalpojumi darbojas utt. Pēc mācīšanās perioda tas sāk veikt normālas operācijas
* Pieejams *tpforward()* izsaukums
* *ATMI* servera pavedieni var kļūt par klientiem, un tie var izpildīt *tpcall()*
* *ATMI* izsauc taimauta pārkonfigurēšanu, izmantojot *tptoutset()* *API* izsaukumu
* Plaša reģistrēšana un atkļūdošana. *Enduro/X* reģistrēšanu var konfigurēt katram binārajam kodam ar dažādiem žurnāla līmeņiem. Tā kā *ATMI* serverus var startēt ārpus lietojumprogrammu servera, tos ir iespējams atkļūdot no programmēšanas vides vai ar īpašiem rīkiem, piemēram, *[[valgrind]]*.
* Kvalitātes nodrošināšanai projekts izmanto automatizētu vienību testēšanu un integrēšanas testēšanu
* Iebūvēta *ATMI* pakalpojumu profilēšana
* Vides mainīgos *XATMI* servera procesiem var atjaunināt bez pilnas lietojumprogrammas atsāknēšanas
* Ģenēriskais klienta procesa monitors (*cpm*). Apakšsistēma ļauj palaist, apstādināt un monitorēt klienta izpildprogrammas. ja klienta procesā notiek avārija, *cpm* to atsāks.
* Sākot ar versiju 5.2 *Enduro/X* nodrošina konfigurācijas datu šifrēšanu, tāpēc programmatūra, kas ir iebūvēta *Enduro/X* augšdaļā, var atbilst maksājumu karšu nozares datu drošības standartam (*Payment Card Industry Data Security Standard — PCI/DSS*).

## Veiktspēja
*Enduro/X* starpprogrammatūrai ir izveidoti vairāki etalonuzdevumi, kas liecina, ka tā diezgan labi konkurē ar *Oracle* *Tuxedo* un *[[ZeroMQ]]*. *Enduro/X* bija par 30 % ātrāks nekā *Tuxedo* 56 KB datu bloku diapazonā. *Enduro/X* bija ievērojami ātrāks nekā *ZeroMQ* 10 — 20 KB diapazonā. Arī testi ar *[[RabbitMQ]]* parādīja *Enduro/X* stiprumu un apsteidza konkurentu. *RPC* izsaukumiem *Enduro/X* bija vairākas reizes priekšā, vienīgi tikai izsaukumu nosūtīšanā *RabbitMQ* bija nedaudz tuvāk *Enduro/X*.

## Apakšsistēmas
*Enduro/X* satur dažādus apakšmoduļus, kas paplašina lietojumprogrammu servera un starpprogrammatūras funkcionalitāti.

### Rindošanas apakšsistēma
*Enduro/X* nodrošina rindošanas apakšsistēmu ar nosaukumu *TMQ* (*Transactional Message Queue*). Šī iespēja nodrošina pastāvīgas rindas, kas ļauj lietojumprogrammām skaidri iekļaut rindas un dzēst ziņojumus no nosauktajām rindām. Rindas var kārtot pēc ziņojuma rindā ievietošanas laika pēc *LIFO* vai *FIFO* sistēmas. Rindas pārvalda ar *XA* saderīgs resursu pārvaldnieks, kas ļauj rindu operācijām piedalīties dalītās transakcijās. Tiek nodrošināts automatizēts rindas pāradresēšanas līdzeklis, kas noņems ierakstus no rindas un izsauks saistītos *Enduro/X ATMI* pakalpojumus, novietojot atbildes ziņojumu saistītā atbildes rindā un  neveiksmīgos ziņojumus kļūmju rindu.

### Konfigurācijas pakalpojumi
*Enduro/X* piedāvā lietojumprogrammām izmantot uz *ini* faila balstītu konfigurācijas lasīšanu, izmantojot īpašu *XATMI* serveri, kas ir pakotnē ar nosaukumu *cconfsrv*. Izmantojot standarta *tpcall()*, parasti lietotāja lietojumprogramma var lasīt konfigurācijas failus (var būt atsevišķi *ini* faili vai mape ar tiem). Metode ļauj izmantot apakšsadaļas ar atslēgas un vērtības pārmantošanu no galvenās sadaļas.

### Izsekošanas reģistrēšanas pakalpojumi
*Enduro/X* ieviesa jaunu *API* funkciju kopu ar nosaukumu *tplog*. Tas ļauj lietotājam izmantot tās pašas uz *C* balstītas augstas veiktspējas atkļūdošanas reģistrēšanas iespējas, ko *Enduro/X* izmanto iekšēji. Visu reģistrēšanu var novirzīt pēc pavedienu bāzes failiem. Ir arī *API* pieprasījumu reģistrēšanai, kas nozīmē, ka lietotājs un *Enduro/X* var veikt reģistrēšanu atsevišķos failos katram pieprasījumam (piemēram, reģistrēt pēc sesijas identifikatora, pēc lietotājvārda utt.).

### ''Application Server for Go''
*Application Server for Go* (*ASG*) ir saistījumu projekts virs *Enduro/X*. Autori šos saistījumus uzskata par lietojumprogrammu serveri *Go* valodai, jo *Golang* projekti ir saistīti statiski, un pēc noklusējuma tiem nav tādu elementu kā komponenti. *Enduro/X* ļauj palaist atsevišķus izpildāmos bināros kodus, kas ir bezstatusa pakalpojumui. Šos pakalpojumus var atkārtoti ielādēt bez pakalpojuma pārtraukuma. Platforma arī ļauj veikt dalītu transakciju apstrādi, izmantojot *Golang*. Izstrādātāji nodrošina *Go* valodai modificētus *Oracle DB OCI8* draiverus, kas atbalsta *XA* transakcijas.

### ''Enduro/X-PHP''
*[[PHP|PHP5]]* valodai ir pieejami pilna klienta saistījumi. Klienta *PHP* procesi var kompilēt ielādējamu moduli vai kompilēt *Enduro/X* procesu *PHP* iekšienē. Ja *PHP* process darbojas kā klients, tam jāatrodas *Enduro/X* lietojumprogrammu vidē, ko var veikt, kad lietojumprogramma tiek viesota pie tā paša lietotāja, kur darbojas *PHP* lietotne (piemēram *[[Apache HTTP serveris|Apache]]*), vai PHP lietotājam, kas izveido mikrovidi, kura, izmantojot *tpbridge* procesu, tālāk savienojas ar galveno lietojumprogrammu serveri.

### ''Enduro/X-Perl''
*[[Perl]]* skriptēšanas valodai ir pieejami klienta un servera saistījumi.

## Ārējās saites
* Enduro/X
* Mavimax