Sprievodca po Atomikos

1. Úvod

Atomikos je transakčná knižnica pre aplikácie Java. V tomto tutoriáli pochopíme, prečo a ako používať Atomikos.

V tomto procese si tiež prejdeme základné informácie o transakciách a o tom, prečo ich potrebujeme.

Potom vytvoríme jednoduchú aplikáciu s transakciami využívajúcimi rôzne API od Atomikosu.

2. Porozumenie základom

Predtým, ako diskutujeme o spoločnosti Atomikos, poďme pochopiť, čo presne transakcie sú a niekoľko konceptov s nimi súvisiacich. Zjednodušene povedané, transakcia je logická pracovná jednotka, ktorej účinok je mimo transakcie viditeľný buď ako celok, alebo vôbec.

Zoberme si príklad, aby sme tomu lepšie porozumeli. Typická maloobchodná aplikácia rezervuje inventár a potom zadá objednávku:

Tu by sme boli radi, keby sa tieto dve operácie stali spoločne alebo sa nestali vôbec. To môžeme dosiahnuť zabalením týchto operácií do jednej transakcie.

2.1. Miestna vs. distribuovaná transakcia

Transakcia môže zahŕňať niekoľko nezávislých operácií. Tieto operácie môže vykonávať na rovnakom zdroji alebo na rôznych zdrojoch. Zúčastnené komponenty transakcie, ako napríklad databázu, tu označujeme ako zdroj.

Transakcie v rámci jedného zdroja sú známe miestne transakcie, zatiaľ čo transakcie uskutočňované vo viacerých zdrojoch sa nazývajú distribuovaná transakcia:

Tu môžu byť inventárom a objednávkami dve tabuľky v tej istej databáze alebo to môžu byť dve rôzne databázy, ktoré môžu bežať spolu na rôznych strojoch.

2.2. Špecifikácia XA a rozhranie Java Transaction API

XA označuje architektúru eXtended Architecture, čo je špecifikácia spracovania distribuovaných transakcií. The cieľom XA je zabezpečiť atomicitu v globálnych transakciách zahŕňajúcich heterogénne komponenty.

Špecifikácia XA poskytuje integritu prostredníctvom protokolu známeho ako dvojfázové odovzdanie. Dvojfázové potvrdenie je široko používaný distribuovaný algoritmus na uľahčenie rozhodnutia o spáchaní alebo vrátení vrátenia distribuovanej transakcie.

Java Transaction API (JTA) je rozhranie Java Enterprise Edition API vyvinuté v rámci procesu komunity Java. To umožňuje Java aplikáciám a aplikačným serverom vykonávať distribuované transakcie medzi prostriedkami XA.

JTA je modelovaný na architektúre XA a využíva dvojfázové odovzdanie. JTA špecifikuje štandardné rozhrania Java medzi správcom transakcií a ostatnými stranami v distribuovanej transakcii.

3. Úvod do Atomikosu

Teraz, keď sme prešli základmi transakcií, sme pripravení naučiť sa Atomikos. V tejto časti pochopíme, čo to Atomikos vlastne je a ako to súvisí s konceptmi ako XA a JTA. Pochopíme tiež architektúru Atomikosu a prejdeme si jej ponuky produktov.

3.1. Čo je Atomikos

Ako sme videli, JTA poskytuje rozhrania v Jave na vytváranie aplikácií s distribuovanými transakciami. Teraz je JTA iba špecifikácia a neponúka žiadnu implementáciu. Pre nás na spustenie aplikácie, kde využívame JTA, potrebujeme implementáciu JTA. Takáto implementácia sa nazýva správca transakcií.

Aplikačný server zvyčajne poskytuje predvolenú implementáciu správcu transakcií. Napríklad v prípade Enterprise Java Beans (EJB) kontajnery EJB riadia transakčné správanie bez výslovného zásahu vývojárov aplikácií. V mnohých prípadoch to však nemusí byť ideálne a možno budeme potrebovať priamu kontrolu nad transakciou nezávisle od aplikačného servera.

Atomikos je ľahký transakčný manažér pre Javu ktorý umožňuje samostatným aplikáciám využívajúcim distribuované transakcie. Naša aplikácia v podstate nemusí pri transakciách spoliehať na komponent vysokej váhy, ako je napríklad aplikačný server. Prináša to koncept distribuovaných transakcií bližšie k cloudovej natívnej architektúre.

3.2. Atomikos Architecture

Atomikos je postavený predovšetkým ako správca transakcií JTA, a teda implementuje architektúru XA s dvojfázovým protokolom potvrdenia. Pozrime sa na architektúru na vysokej úrovni s Atomikos:

Atomikos tu uľahčuje transakciu založenú na dvojfázovom potvrdení, ktorá sa rozprestiera cez databázu a front správ.

3.3. Ponuky produktov Atomikos

Atomikos je manažér distribuovaných transakcií, ktorý ponúka viac funkcií, ako vyžaduje JTA / XA. Má produkt typu open-source a oveľa komplexnejšiu komerčnú ponuku:

  • TransactionEssentials: Atomikos ' produkt s otvoreným zdrojovým kódom poskytujúci správcu transakcií JTA / XA pre aplikácie Java práca s databázami a frontami správ. To je väčšinou užitočné na testovacie a hodnotiace účely.
  • Extrémne transakcie: komerčná ponuka spoločnosti Atomikos, ktorá ponúka distribuované transakcie medzi zloženými aplikáciami, vrátane služieb REST okrem databáz a front správ. To je užitočné pri zostavovaní aplikácií vykonávajúcich spracovanie extrémnych transakcií (XTP).

V tomto tutoriáli použijeme knižnicu TransactionEssentials na zostavenie a demonštráciu schopností Atomikosu.

4. Nastavenie Atomikosu

Ako sme už videli skôr, jedným z vrcholov Atomikosu je ten je to zabudovaná transakčná služba. To znamená, že ho môžeme spustiť v rovnakom JVM ako naša aplikácia. Nastavenie Atomikosu je teda celkom jednoduché.

4.1. Závislosti

Najskôr musíme nastaviť závislosti. Tu musíme iba deklarovať závislosti v našom Mavene pom.xml spis:

 transakcie com.atomikos-jdbc 5.0.6 com.atomikos transakcie-jms 5.0.6 

V tomto prípade používame závislosti Atomikos pre JDBC a JMS, ale podobné závislosti sú k dispozícii v Maven Central pre ďalšie zdroje sťažností XA.

4.2. Konfigurácie

Atomikos poskytuje niekoľko konfiguračných parametrov s rozumnými predvolenými hodnotami pre každý z nich. Najjednoduchší spôsob, ako tieto parametre prepísať, je poskytnúť transakcie.vlastnosti súbor v triede. Môžeme pridať niekoľko parametrov pre inicializáciu a fungovanie transakčnej služby. Pozrime sa na jednoduchú konfiguráciu na prepísanie adresára, kde sa vytvárajú súbory denníka:

com.atomikos.icatch.file = cesta_k_vasmu_souboru

Podobne existujú ďalšie parametre, ktoré môžeme použiť na kontrolu časového limitu pre transakcie, nastavenie jedinečných názvov pre našu aplikáciu alebo definovanie vypínacieho správania.

4.3. Databázy

V našom výučbovom programe zostavíme jednoduchú maloobchodnú aplikáciu, ako je tá, ktorú sme opísali skôr, ktorá rezervuje inventár a potom zadá objednávku. Pre jednoduchosť použijeme relačnú databázu. Na demonštráciu distribuovaných transakcií navyše použijeme viac databáz. Avšak toto sa môže veľmi dobre rozšíriť na ďalšie zdroje sťažností na XA, ako sú fronty správ a témy.

Naša databáza zásob bude mať jednoduchú tabuľku na hosťovanie zásob výrobkov:

VYTVORIŤ ZÁSOB TABUĽKY (productId VARCHAR PRIMARY KEY, zostatok INT);

A naša databáza objednávok bude mať jednoduchú tabuľku na hosťovanie zadaných objednávok:

VYTVORIŤ OBJEDNÁVKY TABUĽKY (PRIMÁRNY KLÍČ OBJEDNÁVKY VARCHAR, VARCHAR PRODUKTU, množstvo INT NIE JE NULL KONTROLA (množstvo <= 5));

Toto je veľmi základné databázové schéma a je užitočné iba na demonštráciu. Je však dôležité poznamenať, že naše obmedzenie schémy neumožňuje objednávku s počtom produktov väčším ako päť.

5. Práca s Atomikos

Teraz sme pripravení použiť jednu z knižníc Atomikos na zostavenie našej aplikácie s distribuovanými transakciami. V nasledujúcich podkapitolách použijeme vstavané adaptéry zdrojov Atomikos na pripojenie k našim back-endovým databázovým systémom. Toto je najrýchlejší a najjednoduchší spôsob, ako začať s Atomikos.

5.1. Vytvára sa inštancia UserTransaction

Budeme využívať JTA UserTransaction na vymedzenie hraníc transakcií. Všetky o ďalšie kroky súvisiace s transakčnou službou sa postará automaticky. To zahŕňa získanie a vyradenie zdrojov z transakčnej služby.

Najprv musíme vytvoriť inštanciu a UserTransaction od spoločnosti Atomikos:

UserTransactionImp utx = nový UserTransactionImp ();

5.2. Vytvára sa inštancia Dátový zdroj

Potom musíme vytvoriť inštanciu a Dátový zdroj od spoločnosti Atomikos. Existujú dve verzie Dátový zdroj ktoré Atomikos sprístupňuje.

Prvý, AtomikosDataSourceBean, je si vedomý podkladového materiálu XADataSource:

AtomikosDataSourceBean dataSource = nový AtomikosDataSourceBean ();

Zatiaľ čo AtomikosNonXADataSourceBean používa akúkoľvek bežnú triedu ovládačov JDBC:

AtomikosNonXADataSourceBean dataSource = nový AtomikosNonXADataSourceBean ();

Ako už názov napovedá, AtomikosNonXADataSource nie je kompatibilný s XA. Nemožno teda zaručiť, že transakcie vykonané s takýmto zdrojom údajov budú atómové. Prečo by sme to teda niekedy používali? Možno máme databázu, ktorá nepodporuje špecifikáciu XA. Atomikos nám nezakazuje používať takýto zdroj údajov a stále sa snaží zabezpečiť atomicitu, ak je v transakcii jediný takýto zdroj údajov. Táto technika je obdobou Last Resource Gambit, variácie dvojfázového procesu odovzdávania.

Ďalej musíme vhodne nakonfigurovať Dátový zdroj v závislosti od databázy a ovládača.

5.3. Vykonávanie databázových operácií

Po nakonfigurovaní je jeho použitie pomerne jednoduché Dátový zdroj v rámci transakcie v našej aplikácii:

public void placeOrder (String productId, int amount) vyvolá výnimku {String orderId = UUID.randomUUID (). toString (); boolean rollback = false; skus {utx.begin (); Pripojenie inventoryConnection = inventoryDataSource.getConnection (); Pripojenie orderConnection = orderDataSource.getConnection (); Výpis s1 = inventoryConnection.createStatement (); Reťazec q1 = "aktualizovať zostatok inventára nastavený = zostatok -" + suma + "kde productId = '" + productId + "'"; s1.executeUpdate (q1); s1.close (); Výpis s2 = orderConnection.createStatement (); Reťazec q2 = "vložiť do hodnôt objednávok ('" + orderId + "', '" + productId + "'," + suma + ")"; s2.executeUpdate (q2); s2.close (); inventoryConnection.close (); orderConnection.close (); } catch (Výnimka e) {rollback = true; } konečne {if (! rollback) utx.commit (); else utx.rollback (); }}

Tu aktualizujeme databázové tabuľky pre zásoby a objednávky v rámci hranice transakcie. To automaticky poskytuje výhodu týchto operácií prebiehajúcich atómovo.

5.4. Testovanie transakčného správania

Nakoniec musíme byť schopní otestovať našu aplikáciu pomocou jednoduchých testov jednotiek, aby sme overili, či sa transakčné správanie deje podľa očakávania:

@Test public void testPlaceOrderSuccess () vyvolá výnimku {int suma = 1; long initialBalance = getBalance (inventoryDataSource, productId); Aplikácia aplikácie = nová Aplikácia (inventoryDataSource, orderDataSource); application.placeOrder (productId, suma); long finalBalance = getBalance (inventoryDataSource, productId); assertEquals (initialBalance - suma, finalBalance); } @Test public void testPlaceOrderFailure () hodí výnimku {int suma = 10; long initialBalance = getBalance (inventoryDataSource, productId); Aplikácia aplikácie = nová Aplikácia (inventoryDataSource, orderDataSource); application.placeOrder (productId, suma); long finalBalance = getBalance (inventoryDataSource, productId); assertEquals (initialBalance, finalBalance); }

Tu, Očakávame, že platná objednávka zníži inventár, zatiaľ čo neplatná objednávka ponechá inventár nezmenený. Upozorňujeme, že podľa našich databázových obmedzení sa každá objednávka s počtom produktov vyšším ako päť považuje za neplatnú objednávku.

5.5. Pokročilé použitie Atomikosu

Vyššie uvedený príklad je najjednoduchší spôsob použitia Atomikosu a možno postačuje na splnenie väčšiny požiadaviek. Existujú však aj iné spôsoby, ako môžeme pomocou Atomikosu vytvoriť našu aplikáciu. Aj keď niektoré z týchto možností uľahčujú používanie Atomikosu, iné ponúkajú väčšiu flexibilitu. Výber závisí od našich požiadaviek.

Samozrejme, že je nie je potrebné vždy používať adaptéry Atomikos pre JDBC / JMS. Môžeme sa rozhodnúť, že použijeme správcu transakcií Atomikos, keď pracujeme priamo s XAResource. V takom prípade sa však musíme výslovne postarať o zaradenie a vyradenie zo zoznamu XAResource inštancie s transakčnou službou.

Atomikos tiež umožňuje použitie pokročilejšie funkcie prostredníctvom proprietárneho rozhrania, UserTransactionService. Pomocou tohto rozhrania môžeme výslovne zaregistrovať prostriedky na zotavenie. Získate tak podrobnú kontrolu nad tým, aké zdroje by sa mali získať, ako by sa mali zotaviť a kedy by sa malo zotavenie uskutočniť.

6. Integrácia Atomikosu

Aj keď Atomikos poskytuje vynikajúcu podporu pre distribuované transakcie, nie je vždy pohodlné pracovať s takými nízkoúrovňovými API. Ak sa chceme zamerať na obchodnú oblasť a vyhnúť sa preplneniu štandardného kódu, často potrebujeme podporu rôznych rámcov a knižníc. Atomikos podporuje väčšinu populárnych rámcov Java súvisiace s back-end integráciami. Tu ich pár preskúmame.

6.1. Atomikos s jarou a Dátový zdroj

Jar je jedným z populárnych rámcov v Jave, ktorý poskytuje kontajner Inversion of Control (IoC). Je pozoruhodné, že má tiež fantastickú podporu pre transakcie. Ponúka deklaratívnu správu transakcií pomocou techník AOP (Aspect-Oriented Programming).

Jar podporuje niekoľko transakčných rozhraní API, vrátane JTA pre distribuované transakcie. Môžeme použiť Atomikos ako náš transakčný manažér JTA v priebehu jari bez väčšieho úsilia. Najdôležitejšie je, že naša aplikácia zostáva vďaka spoločnosti Spring pre Atomikos do značnej miery agnostická.

Pozrime sa, ako môžeme vyriešiť náš predchádzajúci problém, tentokrát s využitím jari. Začneme prepisovaním Aplikácia trieda:

verejná trieda Aplikácia {private DataSource inventoryDataSource; private DataSource orderDataSource; verejná aplikácia (DataSource inventoryDataSource, DataSource orderDataSource) {this.inventoryDataSource = inventoryDataSource; this.orderDataSource = orderDataSource; } @Transactional (rollbackFor = Exception.class) public void placeOrder (String productId, int amount) hodí Exception {String orderId = UUID.randomUUID (). ToString (); Pripojenie inventoryConnection = inventoryDataSource.getConnection (); Pripojenie orderConnection = orderDataSource.getConnection (); Výpis s1 = inventoryConnection.createStatement (); Reťazec q1 = "aktualizovať zostatok inventára nastavený = zostatok -" + suma + "kde productId = '" + productId + "'"; s1.executeUpdate (q1); s1.close (); Výpis s2 = orderConnection.createStatement (); Reťazec q2 = "vložiť do hodnôt objednávok ('" + orderId + "', '" + productId + "'," + suma + ")"; s2.executeUpdate (q2); s2.close (); inventoryConnection.close (); orderConnection.close (); }}

Ako vidíme tu, väčšina štandardného kódu súvisiaceho s transakciami bola nahradená jedinou anotáciou na úrovni metódy. Okrem toho sa Spring stará o instantizáciu a injekciu Dátový zdroj, od čoho závisí naša aplikácia.

Samozrejme musíme Springu poskytnúť príslušné konfigurácie. Na konfiguráciu týchto prvkov môžeme použiť jednoduchú triedu Java:

@Configuration @EnableTransactionManagement verejná trieda Konfigurácia {@Bean (initMethod = "init", destruMethod = "zavrieť") verejná AtomikosDataSourceBean inventoryDataSource () {AtomikosDataSourceBean dataSource = nová AtomikosDataSourceBean (); // Konfigurácia databázy príkazu na zadržanie príkazu vráti dataSource; } @Bean (initMethod = "init", destruMethod = "zavrieť") verejné AtomikosDataSourceBean orderDataSource () {AtomikosDataSourceBean dataSource = nový AtomikosDataSourceBean (); // Konfigurácia databázy príkazu na zadržanie príkazu vráti dataSource; } @Bean (initMethod = "init", destruMethod = "zavrieť") public UserTransactionManager userTransactionManager () hodí SystemException {UserTransactionManager userTransactionManager = nový UserTransactionManager (); userTransactionManager.setTransactionTimeout (300); userTransactionManager.setForceShutdown (true); vrátiť userTransactionManager; } @Bean public JtaTransactionManager jtaTransactionManager () hodí SystemException {JtaTransactionManager jtaTransactionManager = nový JtaTransactionManager (); jtaTransactionManager.setTransactionManager (userTransactionManager ()); jtaTransactionManager.setUserTransaction (userTransactionManager ()); vrátiť jtaTransactionManager; } @Bean public Application application () {return new Application (inventoryDataSource (), orderDataSource ()); }}

Tu sa konfigurujeme AtomikosDataSourceBean pre dve rôzne databázy, ktoré obsahujú naše údaje o zásobách a objednávkach. Okrem toho poskytujeme aj potrebnú konfiguráciu pre správcu transakcií JTA.

Teraz môžeme našu aplikáciu testovať na transakčné správanie ako predtým. Opäť by sme mali overovať, že platná objednávka znižuje náš zostatok na sklade, zatiaľ čo neplatná objednávka ho ponecháva nezmenená.

6.2. Atomikos With Spring, JPA a Hibernate

Aj keď nám Spring do istej miery pomohol obmedziť štandardný kód, stále je to dosť podrobné. Niektoré nástroje môžu prácu s relačnými databázami v Jave ešte uľahčiť. Java Persistence API (JPA) je špecifikácia, ktorá popisuje správu relačných údajov v aplikáciách Java. To do značnej miery zjednodušuje prístup k údajom a manipulačný kód.

Hibernate je jednou z najpopulárnejších implementácií špecifikácie JPA. Atomikos má veľkú podporu pre niekoľko implementácií JPA, vrátane režimu dlhodobého spánku. Rovnako ako predtým zostáva naša aplikácia vďaka programom Spring a JPA agnostická pre Atomikos aj Hibernate.

Uvidíme ako Jar, JPA a Hibernate môžu našu aplikáciu ešte viac skomplikovať a zároveň poskytnúť výhody distribuovaných transakcií prostredníctvom Atomikos. Rovnako ako predtým začneme prepisovaním Aplikácia trieda:

verejná trieda Aplikácia {@Autowired private InventoryRepository inventoryRepository; @Autowired private OrderRepository orderRepository; @Transactional (rollbackFor = Exception.class) public void placeOrder (String productId, int amount) hodí SQLException {String orderId = UUID.randomUUID (). ToString (); Inventárny inventár = inventoryRepository.findOne (productId); inventory.setBalance (inventory.getBalance () - suma); inventoryRepository.save (inventár); Objednávka objednávky = nová objednávka (); order.setOrderId (orderId); order.setProductId (productId); order.setAmount (nový Long (suma)); orderRepository.save (objednávka); }}

Ako vidíme, teraz sa nezaoberáme žiadnymi databázovými API na nízkej úrovni. Aby však táto mágia fungovala, je potrebné nakonfigurovať triedy a konfigurácie Spring Data JPA. Začneme definovaním našich doménových entít:

@Entity @Table (name = "INVENTÁR") verejná trieda Inventár {@Id súkromný reťazec productId; súkromný Dlhý zostatok; // Getters and Setters}
@Entity @Table (name = "OBJEDNÁVKY") verejná trieda Order {@Id private String orderId; private String productId; @ Max (5) súkromné ​​Dlhá suma; // Getters and Setters}

Ďalej musíme poskytnúť úložiská pre tieto subjekty:

@Repository verejné rozhranie InventoryRepository rozširuje JpaRepository {} @Repository verejné rozhranie OrderRepository rozširuje JpaRepository {}

Jedná sa o celkom jednoduché rozhrania a Spring Data sa stará o ich vypracovanie so skutočným kódom na prácu s databázovými entitami.

Nakoniec musíme poskytnúť príslušné konfigurácie pre zdroj údajov pre databázy zásob a objednávok aj pre správcu transakcií:

@Configuration @EnableJpaRepositories (basePackages = "com.baeldung.atomikos.spring.jpa.inventory", entityManagerFactoryRef = "inventoryEntityManager", transactionManagerRef = "transactionManager") verejná trieda InventoryConfig {@Bean (initMethod = "init" ") public AtomikosDataSourceBean inventoryDataSource () {AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean (); // Konfigurácia zdroja údajov return dataSource; } @Bean public EntityManagerFactory inventoryEntityManager () {HibernateJpaVendorAdapter vendorAdapter = nový HibernateJpaVendorAdapter (); LocalContainerEntityManagerFactoryBean factory = nový LocalContainerEntityManagerFactoryBean (); factory.setJpaVendorAdapter (vendorAdapter); // Konfigurácia správcu entít factory return factory.getObject (); }}
@Configuration @EnableJpaRepositories (basePackages = "com.baeldung.atomikos.spring.jpa.order", entityManagerFactoryRef = "orderEntityManager", transactionManagerRef = "transactionManager") verejná trieda OrderConfig {@Bean (initMethod = "init", zničiť) ") public AtomikosDataSourceBean orderDataSource () {AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean (); // Konfigurácia zdroja údajov return dataSource; } @Bean public EntityManagerFactory orderEntityManager () {HibernateJpaVendorAdapter vendorAdapter = nový HibernateJpaVendorAdapter (); LocalContainerEntityManagerFactoryBean factory = nový LocalContainerEntityManagerFactoryBean (); factory.setJpaVendorAdapter (vendorAdapter); // Konfigurácia správcu entít factory return factory.getObject (); }}
@Configuration @EnableTransactionManagement verejná trieda Konfigurácia {@Bean (initMethod = "init", destruMethod = "zavrieť") verejná UserTransactionManager userTransactionManager () hodí SystemException {UserTransactionManager userTransactionManager = nový UserTransactionManager (); userTransactionManager.setTransactionTimeout (300); userTransactionManager.setForceShutdown (true); vrátiť userTransactionManager; } @Bean public JtaTransactionManager transactionManager () vyvolá SystemException {JtaTransactionManager jtaTransactionManager = nový JtaTransactionManager (); jtaTransactionManager.setTransactionManager (userTransactionManager ()); jtaTransactionManager.setUserTransaction (userTransactionManager ()); vrátiť jtaTransactionManager; } @Bean public Application application () {return new Application (); }}

Toto je ešte dosť veľa konfigurácie, ktorú musíme urobiť. Je to čiastočne preto, lebo konfigurujeme Spring JPA pre dve samostatné databázy. Tiež môžeme tieto konfigurácie ďalej redukovať pomocou Spring Boot, ale to je nad rámec tohto tutoriálu.

Rovnako ako predtým môžeme testovať našu aplikáciu na rovnaké transakčné správanie. Tentokrát nie je nič nové, až na to, že teraz používame Spring Data JPA s Hibernate.

7. Atomikos Beyond JTA

Zatiaľ čo JTA poskytuje vynikajúcu podporu transakcií pre distribuované systémy, tieto systémy musia mať reklamáciu XA ako väčšina relačných databáz alebo front správ. Avšak JTA nie je užitočné, ak jeden z týchto systémov nepodporuje špecifikáciu XA pre dvojfázový protokol odovzdania. Do tejto kategórie patrí niekoľko zdrojov, najmä v rámci architektúry mikroslužieb.

Niekoľko alternatívnych protokolov podporuje distribuované transakcie. Jedným z nich je variácia protokolu dvojfázového odovzdania, ktorá využíva kompenzácie. Takéto transakcie majú uvoľnenú záruku izolácie a sú známe ako transakcie založené na kompenzácii. Účastníci sa zaviažu k jednotlivým častiam transakcie v prvej fáze samotnej, pričom v druhej fáze ponúknu kompenzáciu za možné vrátenie platby.

Existuje niekoľko návrhových vzorov a algoritmov na implementáciu transakcie založenej na kompenzácii. Napríklad Sagas je jeden taký populárny dizajnový vzor. Zvyčajne sú však zložité na implementáciu a náchylné na chyby.

Atomikos ponúka variáciu transakcie založenej na kompenzácii s názvom Try-Confirm / Cancel (TCC). TCC ponúka subjektom v rámci transakcie lepšiu obchodnú sémantiku. To je však možné iba s pokročilou podporou architektúry účastníkov a TCC je k dispozícii iba v rámci komerčnej ponuky Atomikos ExtremeTransactions.

8. Alternatívy k Atomikosu

Prešli sme dosť Atomikos, aby sme ocenili, čo ponúka. Okrem toho existuje komerčná ponuka od spoločnosti Atomikos s ešte výkonnejšími funkciami. Atomikos však nie je jedinou možnosťou, pokiaľ ide o výber správcu transakcií JTA. Existuje niekoľko ďalších dôveryhodných možností, z ktorých si môžete vybrať. Pozrime sa, ako sa im darí proti Atomikosu.

8.1. Narayana

Narayana je možno jeden z najstarších manažérov distribuovaných transakcií s otvoreným zdrojovým kódom a v súčasnosti je spravovaná spoločnosťou Red Hat. Bol široko používaný v celom priemysle a vyvinul sa pomocou podpory komunity a ovplyvnil niekoľko špecifikácií a štandardov.

Narayana poskytuje podporu pre širokú škálu transakčných protokolov, ako sú JTA, JTS, Web-Services a REST. Narayana môže byť ďalej vložená do širokej škály nádob.

V porovnaní s Atomikos poskytuje Narayana skoro všetky funkcie manažéra distribuovaných transakcií. V mnohých prípadoch je Narayana flexibilnejšia na integráciu a použitie v aplikáciách. Napríklad Narayana má jazykové väzby pre C / C ++ aj Java. To však prichádza za cenu zvýšenej zložitosti a konfigurácia a použitie Atomikosu je porovnateľne jednoduchšie.

8.2. Bitronix

Bitronix je plne funkčný správca transakcií XA, ktorý poskytuje všetky služby požadované rozhraním JTA API. Dôležité je, že Bitronix je integrovateľná knižnica transakcií, ktorá poskytuje rozsiahle a užitočné hlásenie a protokolovanie chýb. V prípade distribuovanej transakcie to uľahčuje vyšetrovanie zlyhaní. Okrem toho má vynikajúcu podporu pre transakčné schopnosti spoločnosti Spring a pracuje s minimálnymi konfiguráciami.

V porovnaní s Atomikos je Bitronix projekt s otvoreným zdrojovým kódom a nemá komerčnú ponuku s produktovou podporou. Medzi kľúčové vlastnosti, ktoré sú súčasťou komerčnej ponuky spoločnosti Atomikos, ale v systéme Bitronix chýbajú, patrí podpora mikroslužieb a deklaratívna schopnosť pružného škálovania.

9. Záver

Ak to zhrnieme, v tomto návode sme prešli základnými podrobnosťami transakcií. Pochopili sme, čo sú distribuované transakcie a ako môže knižnica ako Atomikos uľahčiť ich vykonávanie. V tomto procese sme využili rozhrania Atomikos API na vytvorenie jednoduchej aplikácie s distribuovanými transakciami.

Tiež sme pochopili, ako Atomikos pracuje s inými populárnymi rámcami a knižnicami Java. Nakoniec sme prešli niekoľkými alternatívami k Atomikosu, ktoré máme k dispozícii.

Ako obvykle, zdrojový kód tohto článku nájdete na GitHub.


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