Vodič za Atomikos

1. Uvod

Atomikos je knjižnica transakcija za Java programe. U ovom uputstvu razumjet ćemo zašto i kako koristiti Atomikos.

U tom ćemo procesu također proći kroz osnove transakcija i zašto su nam potrebne.

Zatim ćemo stvoriti jednostavnu aplikaciju s transakcijama koje koriste različite API-je tvrtke Atomikos.

2. Razumijevanje osnova

Prije nego što razgovaramo o Atomikosu, shvatimo što su točno transakcije i nekoliko koncepata povezanih s njima. Jednostavno rečeno, transakcija je logična cjelina rada čiji je učinak vidljiv izvan transakcije ili u cijelosti ili uopće nije.

Uzmimo primjer da to bolje razumijemo. Tipična maloprodajna aplikacija rezervira inventar, a zatim daje narudžbu:

Ovdje bismo željeli da se ove dvije operacije ili dogode zajedno ili se uopće ne dogode. To možemo postići umotavanjem tih operacija u jednu transakciju.

2.1. Lokalna naspram distribuirane transakcije

Transakcija može uključivati ​​više neovisnih operacija. Te operacije može izvršavati na istom resursu ili na različitim resursima. Ovdje se kao resurs pozivamo na komponente koje sudjeluju u transakciji poput baze podataka.

Transakcije unutar jednog resursa poznate su kao lokalne transakcije, dok su one koje se pojavljuju u više resursa poznate kao distribuirana transakcija:

Ovdje inventar i narudžbe mogu biti dvije tablice u istoj bazi podataka ili mogu biti dvije različite baze podataka - koje se mogu pokretati na različitim strojevima.

2.2. XA specifikacija i Java Transaction API

XA se odnosi na eXtended Architecture, koja je specifikacija za obradu distribuiranih transakcija. The Cilj XA je pružiti atomskost u globalnim transakcijama koje uključuju heterogene komponente.

XA specifikacija pruža integritet kroz protokol poznat kao dvofazno predavanje. Dvofazno predavanje široko je korišteni distribuirani algoritam za olakšavanje odluke o predavanju ili vraćanju distribuirane transakcije.

Java Transaction API (JTA) je Java Enterprise Edition API razvijen u okviru Java Community Process. To omogućuje Java programima i aplikacijskim poslužiteljima izvršavanje distribuiranih transakcija kroz XA resurse.

JTA je oblikovan prema XA arhitekturi, koristeći dvofazno predavanje. JTA određuje standardna Java sučelja između upravitelja transakcija i ostalih strana u distribuiranoj transakciji.

3. Uvod u Atomikos

Sad kad smo prošli kroz osnove transakcija, spremni smo naučiti Atomikos. U ovom ćemo odjeljku razumjeti što je točno Atomikos i kako se odnosi na koncepte poput XA i JTA. Također ćemo razumjeti arhitekturu Atomikosa i proći ćemo kroz njegovu ponudu proizvoda.

3.1. Što je Atomikos

Kao što smo vidjeli, JTA nudi sučelja u Javi za izgradnju aplikacija s distribuiranim transakcijama. Sada je JTA samo specifikacija i ne nudi nikakvu implementaciju. Za nas da bismo pokrenuli aplikaciju u kojoj koristimo JTA, potrebna nam je implementacija JTA. Takva se implementacija naziva transakcijski upravitelj.

Tipično, aplikacijski poslužitelj pruža zadanu implementaciju upravitelja transakcija. Na primjer, u slučaju Enterprise Java Beans (EJB), EJB spremnici upravljaju ponašanjem transakcija bez ikakve izričite intervencije programera aplikacija. Međutim, u mnogim slučajevima to možda nije idealno i možda će nam trebati izravna kontrola nad transakcijom neovisno o poslužitelju aplikacija.

Atomikos je lagani upravitelj transakcija za Javu koji omogućuje da aplikacije koje koriste distribuirane transakcije budu samostalne. U osnovi, naša se aplikacija ne mora oslanjati na tešku komponentu poput aplikacijskog poslužitelja za transakcije. Ovo približava koncept distribuiranih transakcija arhitekturi izvornoj za oblak.

3.2. Atomikos Arhitektura

Atomikos je izgrađen prvenstveno kao upravitelj transakcija JTA i, prema tome, provodi XA arhitekturu s dvofaznim protokolom urezivanja. Pogledajmo arhitekturu na visokoj razini s Atomikosom:

Ovdje Atomikos omogućuje transakciju temeljenu na dvofaznoj fazi koja se proteže kroz bazu podataka i red poruka.

3.3. Atomikos ponude proizvoda

Atomikos je distribuirani upravitelj transakcija koji nudi više značajki od onoga što JTA / XA nalaže. Ima proizvod otvorenog koda i puno sveobuhvatniju komercijalnu ponudu:

  • TransakcijeOsnovno: Atomikos ' proizvod otvorenog koda koji pruža JTA / XA upravitelj transakcija za Java aplikacije rad s bazama podataka i redovima poruka. Ovo je uglavnom korisno za testiranje i ocjenu.
  • ExtremeTransaction: komercijalna ponuda Atomikosa, koja nudi distribuirane transakcije kroz složene aplikacije, uključujući REST usluge, osim baza podataka i redova poruka. Ovo je korisno za izgradnju aplikacija koje izvode ekstremnu obradu transakcija (XTP).

U ovom uputstvu koristit ćemo knjižnicu TransactionsEssentials za izgradnju i demonstraciju mogućnosti Atomikosa.

4. Postavljanje Atomikosa

Kao što smo vidjeli ranije, jedan od vrhunaca Atomikosa je taj to je ugrađena transakcijska usluga. To znači da ga možemo pokrenuti u istom JVM-u kao i naša aplikacija. Stoga je postavljanje Atomikosa sasvim jednostavno.

4.1. Ovisnosti

Prvo, moramo postaviti ovisnosti. Ovdje sve što trebamo učiniti je proglasiti ovisnosti u našem Mavenu pom.xml datoteka:

 com.atomikos transakcije-jdbc 5.0.6 com.atomikos transakcije-jms 5.0.6 

U ovom slučaju koristimo ovisnosti Atomikos za JDBC i JMS, ali slične ovisnosti dostupne su na Maven Central-u za druge resurse XA-žalbe.

4.2. Konfiguracije

Atomikos nudi nekoliko konfiguracijskih parametara sa razumnim zadanim postavkama za svakog od njih. Najlakši način nadjačavanja ovih parametara je pružiti a transakcije.svojstva datoteku u stazi. Možemo dodati nekoliko parametara za inicijalizaciju i rad transakcijske usluge. Pogledajmo jednostavnu konfiguraciju za nadjačavanje direktorija u kojem se kreiraju datoteke dnevnika:

com.atomikos.icatch.file = put_do_svoje_datoteke

Slično tome, postoje i drugi parametri pomoću kojih možemo kontrolirati vremensko ograničenje za transakcije, postaviti jedinstvena imena za našu aplikaciju ili definirati ponašanje prilikom isključivanja.

4.3. Baze podataka

U našem uputstvu izradit ćemo jednostavnu maloprodajnu aplikaciju, poput one koju smo ranije opisali, koja rezervira zalihu, a zatim naručuje. Za jednostavnost ćemo koristiti relacijsku bazu podataka. Štoviše, koristit ćemo više baza podataka za demonstraciju distribuiranih transakcija. Međutim, to se vrlo dobro može proširiti i na druge resurse XA-pritužbi poput redova poruka i tema.

Naša baza inventara imat će jednostavnu tablicu za smještaj zaliha proizvoda:

IZRADI INVENTAR ZA STOLE (PRIMARNI KLJUČ VARCHAR proizvoda, Vrijednost INT);

I, naša baza podataka o narudžbama imat će jednostavnu tablicu za smještaj narudžbi:

IZRADITE NARUDŽBE ZA STOLE (NARUČITE PRIMARNI KLJUČ VARCHAR, Vrijednost proizvoda ID VARCHAR, iznos INT NIJE NULTA PROVJERA (iznos <= 5));

Ovo je vrlo osnovna shema baze podataka i korisna samo za demonstraciju. Međutim, važno je napomenuti da naše ograničenje sheme ne dopušta narudžbu s količinom proizvoda većom od pet.

5. Rad s Atomikosom

Sada smo spremni koristiti jednu od Atomikos knjižnica za izgradnju naše aplikacije s distribuiranim transakcijama. U sljedećim pododjeljcima koristit ćemo ugrađene prilagodnike resursa Atomikos za povezivanje s našim pozadinskim sustavima baza podataka. Ovo je najbrži i najlakši način za početak rada s Atomikosom.

5.1. Instantirajuće Korisnička transakcija

Mi ćemo iskoristiti JTA Korisnička transakcija za razgraničenje transakcijskih granica. svi automatski će se pobrinuti za ostale korake povezane s uslugom transakcija. To uključuje prijavu i uklanjanje resursa s uslugom transakcija.

Prvo, moramo napraviti instancu a Korisnička transakcija iz Atomikosa:

UserTransactionImp utx = novi UserTransactionImp ();

5.2. Instantirajuće Izvor podataka

Zatim, moramo instancirati a Izvor podataka iz Atomikosa. Tamo su dvije verzije Izvor podataka koje Atomikos stavlja na raspolaganje.

Prvi, AtomikosDataSourceBean, svjestan je temelja XADataSource:

AtomikosDataSourceBean dataSource = novo AtomikosDataSourceBean ();

Dok AtomikosNonXADataSourceBean koristi bilo koju redovnu klasu JDBC upravljačkih programa:

AtomikosNonXADataSourceBean dataSource = novo AtomikosNonXADataSourceBean ();

Kao što i samo ime govori, AtomikosNonXADataSource nije u skladu s XA. Stoga se transakcije izvršene s takvim izvorom podataka ne mogu zajamčiti atomskim. Pa zašto bismo to ikad koristili? Možda imamo neku bazu podataka koja ne podržava XA specifikaciju. Atomikos nam ne zabranjuje upotrebu takvog izvora podataka i još uvijek pokušava pružiti atomskost ako u transakciji postoji jedan takav izvor podataka. Ova je tehnika slična Last Resource Gambit-u, varijaciji dvofaznog postupka urezivanja.

Nadalje, moramo na odgovarajući način konfigurirati Izvor podataka ovisno o bazi podataka i pokretačkom programu.

5.3. Izvođenje operacija baze podataka

Jednom konfiguriran, prilično je jednostavan za upotrebu Izvor podataka u kontekstu transakcije u našoj aplikaciji:

javna void placeOrder (String productId, int iznos) baca iznimku {String orderId = UUID.randomUUID (). toString (); logičko vraćanje = lažno; isprobajte {utx.begin (); Veza inventoryConnection = inventoryDataSource.getConnection (); Veza orderConnection = orderDataSource.getConnection (); Izjava s1 = inventoryConnection.createStatement (); Niz q1 = "ažuriranje Zaliha postavljeno stanje = stanje -" + iznos + "gdje productId = '" + productId + "'"; s1.executeUpdate (q1); s1.close (); Izjava s2 = orderConnection.createStatement (); Niz q2 = "umetni u vrijednosti narudžbi ('" + orderId + "', '" + productId + "'," + iznos + ")"; s2.executeUpdate (q2); s2.close (); inventoryConnection.close (); orderConnection.close (); } catch (Iznimka e) {rollback = true; } napokon {if (! rollback) utx.commit (); inače utx.rollback (); }}

Ovdje ažuriramo tablice baze podataka za inventar i poredak unutar granica transakcije. To automatski pruža prednost ovih operacija koje se odvijaju atomski.

5.4. Testiranje transakcijskog ponašanja

Napokon, moramo biti u mogućnosti testirati našu aplikaciju jednostavnim jediničnim testovima kako bismo potvrdili da je ponašanje transakcije očekivano:

@Test public void testPlaceOrderSuccess () baca iznimku {int iznos = 1; dugački InitiBalance = getBalance (inventoryDataSource, productId); Prijava aplikacije = nova aplikacija (inventoryDataSource, orderDataSource); application.placeOrder (productId, količina); long finalBalance = getBalance (inventoryDataSource, productId); assertEquals (InitialBalance - iznos, finalBalance); } @Test public void testPlaceOrderFailure () baca iznimku {int iznos = 10; dugački InitiBalance = getBalance (inventoryDataSource, productId); Prijava aplikacije = nova aplikacija (inventoryDataSource, orderDataSource); application.placeOrder (productId, količina); long finalBalance = getBalance (inventoryDataSource, productId); assertEquals (InitialBalance, FinalBalance); }

Ovdje, očekujemo valjanu narudžbu za smanjenje zaliha, dok očekujemo da nevažeća narudžba ostavi inventar nepromijenjenom. Imajte na umu da se, prema ograničenju naše baze podataka, bilo koja narudžba s količinom većom od pet proizvoda smatra nevaljanom narudžbom.

5.5. Napredna upotreba Atomikosa

Gornji je primjer najjednostavniji način korištenja Atomikosa i možda dovoljan za većinu zahtjeva. Međutim, postoje i drugi načini na koje Atomikos možemo koristiti za izgradnju naše aplikacije. Iako neke od ovih opcija Atomikos čine jednostavnim za upotrebu, druge nude veću fleksibilnost. Izbor ovisi o našim zahtjevima.

Naravno da je nije potrebno uvijek koristiti Atomikos adaptere za JDBC / JMS. Možemo odabrati upotrebu Atomikos upravitelja transakcija tijekom izravnog rada XARizvor. Međutim, u tom slučaju moramo izričito voditi brigu o prijavi i uklanjanju s popisa XARizvor instance s uslugom transakcija.

Atomikos također omogućuje upotrebu naprednije značajke putem vlasničkog sučelja, UserTransactionService. Korištenjem ovog sučelja možemo izričito registrirati resurse za oporavak. To nam daje preciznu kontrolu nad time koje resurse treba oporaviti, kako ih treba oporaviti i kada bi se oporavak trebao dogoditi.

6. Integriranje Atomikosa

Iako Atomikos pruža izvrsnu podršku za distribuirane transakcije, nije uvijek prikladno raditi s takvim API-ima niske razine. Da bismo se usredotočili na poslovnu domenu i izbjegli pretrpanost standardnih kodova, često nam je potrebna podrška različitih okvira i knjižnica. Atomikos podržava većinu popularnih Java okvira povezane s pozadinskim integracijama. Istražit ćemo ih nekoliko ovdje.

6.1. Atomikos s proljećem i Izvor podataka

Spring je jedan od popularnih okvira u Javi koji pruža spremnik Inverzija upravljanja (IoC). Istaknuto je da ima fantastičnu podršku i za transakcije. Nudi deklarativno upravljanje transakcijama pomoću tehnika usmjerenog na aspekte (AOP).

Spring podržava nekoliko API-ja za transakcije, uključujući JTA za distribuirane transakcije. Možemo koristiti Atomikos kao naš upravitelj transakcija JTA u Proljeće bez puno napora. Što je najvažnije, naša aplikacija ostaje prilično agnostična za Atomikos, zahvaljujući Springu.

Pogledajmo kako možemo riješiti naš prethodni problem, ovoga puta iskoristivši Proljeće. Počet ćemo s prepisivanjem Primjena razred:

aplikacija javne klase {private DataSource inventoryDataSource; privatni DataSource orderDataSource; javna aplikacija (DataSource inventoryDataSource, DataSource orderDataSource) {this.inventoryDataSource = inventoryDataSource; this.orderDataSource = orderDataSource; } @Transactional (rollbackFor = Exception.class) javna praznina placeOrder (String productId, int iznos) baca iznimku {String orderId = UUID.randomUUID (). ToString (); Veza inventoryConnection = inventoryDataSource.getConnection (); Veza orderConnection = orderDataSource.getConnection (); Izjava s1 = inventoryConnection.createStatement (); Niz q1 = "ažuriranje Zaliha postavljeno stanje = stanje -" + iznos + "gdje productId = '" + productId + "'"; s1.executeUpdate (q1); s1.close (); Izjava s2 = orderConnection.createStatement (); Niz q2 = "umetni u vrijednosti narudžbi ('" + orderId + "', '" + productId + "'," + iznos + ")"; s2.executeUpdate (q2); s2.close (); inventoryConnection.close (); orderConnection.close (); }}

Kao što ovdje možemo vidjeti, većina uzorka koda koji se odnosi na transakciju zamijenjena je jednom bilješkom na razini metode. Štoviše, Spring se brine o instanciranju i ubrizgavanju Izvor podataka, o čemu ovisi naša aplikacija.

Naravno, Springu moramo pružiti relevantne konfiguracije. Za konfiguriranje ovih elemenata možemo koristiti jednostavnu Java klasu:

@Configuration @EnableTransactionManagement javna klasa Konfiguriranje {@Bean (initMethod = "init", killMethod = "close") public AtomikosDataSourceBean inventoryDataSource () {AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean; // Konfiguriranje naloga za zadržavanje baze podataka za vraćanje podataka dataSource; } @Bean (initMethod = "init", killMethod = "close") public AtomikosDataSourceBean orderDataSource () {AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean (); // Konfiguriranje naloga za zadržavanje baze podataka za vraćanje podataka dataSource; } @Bean (initMethod = "init", killMethod = "close") public UserTransactionManager userTransactionManager () baca SystemException {UserTransactionManager userTransactionManager = new UserTransactionManager (); userTransactionManager.setTransactionTimeout (300); userTransactionManager.setForceShutdown (istina); vratiti userTransactionManager; } @Bean public JtaTransactionManager jtaTransactionManager () baca SystemException {JtaTransactionManager jtaTransactionManager = new JtaTransactionManager (); jtaTransactionManager.setTransactionManager (userTransactionManager ()); jtaTransactionManager.setUserTransaction (userTransactionManager ()); vrati jtaTransactionManager; } @Bean javna aplikacija za aplikaciju () {vratiti novu aplikaciju (inventoryDataSource (), orderDataSource ()); }}

Evo, mi konfiguriramo AtomikosDataSourceBean za dvije različite baze podataka koje sadrže naš inventar i podatke o narudžbi. Štoviše, pružamo i potrebnu konfiguraciju za upravitelja transakcija JTA.

Sada možemo testirati našu aplikaciju za transakcijsko ponašanje kao i prije. Opet bismo trebali potvrditi da valjana narudžba smanjuje stanje zaliha, dok nevažeća narudžba ostavlja nepromijenjenu.

6.2. Atomikos s proljećem, JPA i hibernacijom

Iako nam je Spring pomogao da u određenoj mjeri smanjimo šifru, to je još uvijek prilično opširno. Neki alati mogu još više olakšati rad s relacijskim bazama podataka u Javi. Java Persistent API (JPA) specifikacija je koja opisuje upravljanje relacijskim podacima u Java aplikacijama. To u velikoj mjeri pojednostavljuje pristup podacima i manipulacijski kod.

Hibernate je jedna od najpopularnijih implementacija JPA specifikacije. Atomikos ima veliku podršku za nekoliko implementacija JPA, uključujući hibernaciju. Kao i prije, naša aplikacija ostaje agnostična za Atomikos, kao i za hibernaciju, zahvaljujući Spring i JPA!

Da vidimo kako Proljeće, JPA i Hibernate mogu našu aplikaciju učiniti još sažetijom dok pružaju blagodati distribuiranih transakcija putem Atomikosa. Kao i prije, počet ćemo s prepisivanjem datoteke Primjena razred:

aplikacija javne klase {@Autowired private InventoryRepository inventoryRepository; @Autowired privatni OrderRepository orderRepository; @Transactional (rollbackFor = Exception.class) javna praznina placeOrder (String productId, int iznos) baca SQLException {String orderId = UUID.randomUUID (). ToString (); Inventarni inventar = inventoryRepository.findOne (productId); inventory.setBalance (inventory.getBalance () - iznos); inventoryRepository.save (inventar); Narudžba narudžbe = nova narudžba (); order.setOrderId (orderId); order.setProductId (productId); order.setAmount (novi Long (iznos)); orderRepository.save (narudžba); }}

Kao što vidimo, sada nemamo posla s API-jem baze podataka niske razine. Međutim, da bi ta magija uspjela, moramo konfigurirati JPA klase i konfiguracije Spring Data. Počet ćemo s definiranjem entiteta domene:

@Entity @Table (name = "INVENTAR") Inventar javne klase {@Id private String productId; privatni Long balance; // Dobavljači i postavljači}
@Entity @Table (name = "ORDERS") narudžba javne klase {@Id private String orderId; private String productId; @Max (5) privatni Dugi iznos; // Dobavljači i postavljači}

Dalje, trebamo osigurati spremišta za ove entitete:

@Repository javno sučelje InventoryRepository proširuje JpaRepository {} @Repository javno sučelje OrderRepository proširuje JpaRepository {}

To su prilično jednostavna sučelja, a Spring Data se brine za njihovu razradu sa stvarnim kodom za rad s entitetima baze podataka.

Na kraju, moramo pružiti relevantne konfiguracije za izvor podataka za baze podataka inventara i naloga i za upravitelja transakcija:

@Configuration @EnableJpaRepositories (basePackages = "com.baeldung.atomikos.spring.jpa.inventory", entityManagerFactoryRef = "inventoryEntityManager" ,actionManagerRef = "actionManager ") javna klasa InventoryConfig {@Bean (method initMethod ") public AtomikosDataSourceBean inventoryDataSource () {AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean (); // Konfiguriranje izvora podataka vraća dataSource; } @Bean public EntityManagerFactory inventoryEntityManager () {HibernateJpaVendorAdapter vendorAdapter = novi HibernateJpaVendorAdapter (); LocalContainerEntityManagerFactoryBean factory = nova LocalContainerEntityManagerFactoryBean (); factory.setJpaVendorAdapter (vendorAdapter); // Konfiguriranje vraćanja tvornice upravitelja entiteta factory.getObject (); }}
@Configuration @EnableJpaRepositories (basePackages = "com.baeldung.atomikos.spring.jpa.order", entityManagerFactoryRef = "orderEntityManager" ,actionManagerRef = "actionManager ") javna klasa OrderConfig {@Bean (initMethod =" initMet = Metod = "initMethod =" init ") public AtomikosDataSourceBean orderDataSource () {AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean (); // Konfiguriranje izvora podataka vraća dataSource; } @Bean public EntityManagerFactory orderEntityManager () {HibernateJpaVendorAdapter vendorAdapter = novi HibernateJpaVendorAdapter (); LocalContainerEntityManagerFactoryBean factory = nova LocalContainerEntityManagerFactoryBean (); factory.setJpaVendorAdapter (vendorAdapter); // Konfiguriranje vraćanja tvornice upravitelja entiteta factory.getObject (); }}
@Configuration @EnableTransactionManagement javna klasa Konfiguracija {@Bean (initMethod = "init", killMethod = "close") public UserTransactionManager userTransactionManager () baca SystemException {UserTransactionManager userTransactionManager = new UserTransactionManager; userTransactionManager.setTransactionTimeout (300); userTransactionManager.setForceShutdown (istina); vratiti userTransactionManager; } @Bean public JtaTransactionManageractionManager () baca SystemException {JtaTransactionManager jtaTransactionManager = new JtaTransactionManager (); jtaTransactionManager.setTransactionManager (userTransactionManager ()); jtaTransactionManager.setUserTransaction (userTransactionManager ()); vrati jtaTransactionManager; } @Bean javna aplikacija za prijavu () {return new Application (); }}

Ovo je još uvijek dosta konfiguracije koju moramo obaviti. To je djelomično zato što konfiguriramo Spring JPA za dvije odvojene baze podataka. Također, ove konfiguracije možemo dodatno smanjiti putem Spring Boota, ali to je izvan dosega ovog vodiča.

Kao i prije, možemo testirati našu aplikaciju na isto transakcijsko ponašanje. Ovaj put nema ništa novo, osim činjenice da sada koristimo Spring Data JPA s Hibernateom.

7. Atomikos izvan JTA-e

Iako JTA pruža izvrsnu podršku transakcijama za distribuirane sustave, ti sustavi moraju biti XA-prigovori kao i većina relacijskih baza podataka ili redovi poruka. Međutim, JTA nije koristan ako jedan od ovih sustava ne podržava XA specifikaciju za dvofazni protokol urezivanja. Nekoliko resursa spada u ovu kategoriju, posebno unutar arhitekture mikro usluga.

Nekoliko alternativnih protokola podržava distribuirane transakcije. Jedan od tih je varijacija dvofaznog protokola urezivanja koja koristi kompenzacije. Takve transakcije imaju opušteno jamstvo izolacije i poznate su kao transakcije temeljene na naknadi. Sudionici počinju pojedinačne dijelove transakcije u samoj prvoj fazi, nudeći obrađivaču nadoknade za mogući povrat u drugoj fazi.

Postoji nekoliko dizajnerskih obrazaca i algoritama za provođenje transakcije temeljene na kompenzaciji. Na primjer, Sagas je jedan od takvih popularnih dizajnerskih obrazaca. Međutim, oni su obično složeni za primjenu i skloni pogreškama.

Atomikos nudi varijaciju transakcije temeljenu na naknadi nazvanu Pokušaj potvrditi / otkazati (TCC). TCC nudi bolju poslovnu semantiku subjektima u transakciji. Međutim, to je moguće samo uz naprednu arhitektonsku podršku sudionika, a TCC je dostupan samo u komercijalnoj ponudi Atomikosa, ExtremeTransactions.

8. Alternative Atomikosu

Prošli smo dovoljno Atomikosa da cijenimo što on nudi. Štoviše, postoji komercijalna ponuda tvrtke Atomikos s još snažnijim značajkama. Međutim, Atomikos nije jedina opcija kada je u pitanju odabir JTA menadžera transakcija. Postoji nekoliko drugih vjerodostojnih opcija koje možete odabrati. Pogledajmo kako će proći protiv Atomikosa.

8.1. Narayana

Narayana je možda jedan od najstarijih menadžera otvorenih koda distribuiranih transakcija a trenutno njime upravlja Red Hat. Široko se koristi u industriji, a razvio se kroz podršku zajednice i utjecao na nekoliko specifikacija i standarda.

Narayana pruža podršku za širok raspon protokola transakcija poput JTA, JTS, web-usluga i REST-a, da nabrojimo samo neke. Nadalje, Narayana se može ugraditi u širok raspon spremnika.

U usporedbi s Atomikosom, Narayana pruža gotovo sve značajke distribuiranog upravitelja transakcija. U mnogim je slučajevima Narayana fleksibilnija za integraciju i upotrebu u aplikacijama. Na primjer, Narayana ima jezične vezove i za C / C ++ i za Javu. Međutim, to dolazi po cijenu dodatne složenosti, a Atomikos je relativno lakše konfigurirati i koristiti.

8.2. Bitronix

Bitronix je potpuno radni XA upravitelj transakcija koji pruža sve usluge koje zahtijeva JTA API. Što je najvažnije, Bitronix je ugradiva knjižnica transakcija koja pruža opsežno i korisno izvještavanje o pogreškama i evidentiranje. Za distribuiranu transakciju ovo olakšava istraživanje kvarova. Štoviše, ima izvrsnu podršku za transakcijske mogućnosti Springa i radi s minimalnim konfiguracijama.

U usporedbi s Atomikosom, Bitronix je projekt otvorenog koda i nema komercijalnu ponudu s podrškom za proizvode. Ključne značajke koje su dio Atomikosove komercijalne ponude, ali nedostaju Bitronixu, uključuju podršku za mikroservise i mogućnost deklarativnog elastičnog skaliranja.

9. Zaključak

Da rezimiramo, u ovom uputstvu smo prošli kroz osnovne detalje transakcija. Shvatili smo što su distribuirane transakcije i kako knjižnica poput Atomikosa može olakšati njihovo obavljanje. U tom smo procesu iskoristili Atomikos API-je za stvaranje jednostavne aplikacije s distribuiranim transakcijama.

Također smo razumjeli kako Atomikos radi s drugim popularnim Java okvirima i knjižnicama. Napokon smo prošli neke od alternativa Atomikosu koje su nam dostupne.

Kao i obično, izvorni kod za ovaj članak može se naći na GitHubu.


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