Patroon Compenserende transactie

Azure

Wanneer u een uiteindelijk consistente bewerking gebruikt die uit een reeks stappen bestaat, kan het patroon Compenserende transactie nuttig zijn. Als een of meer van de stappen mislukken, kunt u het patroon Compenserende transactie gebruiken om het werk dat door de stappen is uitgevoerd ongedaan te maken. Normaal gesproken vindt u bewerkingen die het uiteindelijke consistentiemodel volgen in in de cloud gehoste toepassingen die complexe bedrijfsprocessen en werkstromen implementeren.

Context en probleem

Toepassingen die in de cloud worden uitgevoerd, wijzigen regelmatig gegevens. Deze gegevens worden soms verspreid over verschillende gegevensbronnen op verschillende geografische locaties. Om in een gedistribueerde omgeving conflicten te voorkomen en prestaties te verbeteren, mag een toepassing geen sterke transactionele consistentie bieden. In plaats daarvan moet de toepassing uiteindelijke consistentie implementeren. In het uiteindelijke consistentiemodel bestaat een typische bedrijfsbewerking uit een reeks afzonderlijke stappen. Terwijl de bewerking deze stappen uitvoert, kan de algehele weergave van de systeemstatus inconsistent zijn. Maar wanneer de bewerking is voltooid en alle stappen zijn uitgevoerd, moet het systeem weer consistent worden.

The Data Consistency Primer biedt informatie over waarom gedistribueerde transacties niet goed worden geschaald. Deze resource bevat ook principes van het uiteindelijke consistentiemodel.

Een uitdaging in het uiteindelijke consistentiemodel is het afhandelen van een stap die mislukt. Na een fout moet u mogelijk al het werk ongedaan maken dat in de vorige stappen in de bewerking is voltooid. U kunt de gegevens echter niet altijd terugdraaien, omdat andere gelijktijdige exemplaren van de toepassing deze mogelijk hebben gewijzigd. Zelfs in gevallen waarin gelijktijdige instanties de gegevens niet hebben gewijzigd, kan het ongedaan maken van een stap complexer zijn dan het herstellen van de oorspronkelijke status. Het kan nodig zijn om verschillende bedrijfsspecifieke regels toe te passen. Zie voor een voorbeeld de reiswebsite die in de sectie Voorbeeld verderop in dit artikel wordt beschreven.

Als een bewerking die uiteindelijke consistentie implementeert meerdere heterogene gegevensarchieven omvat, moet u bij het ongedaan maken van de stappen in de bewerking elk gegevensarchief op zijn beurt bezoeken. Om te voorkomen dat het systeem inconsistent blijft, moet u het werk dat u in elk gegevensarchief hebt uitgevoerd betrouwbaar ongedaan maken.

De gegevens die worden beïnvloed door een bewerking die uiteindelijke consistentie implementeert, worden niet altijd bewaard in een database. Denk bijvoorbeeld aan een soa-omgeving (servicegeoriënteerde architectuur). Een SOA-bewerking kan een actie in een service aanroepen en een wijziging veroorzaken in de status die door die service wordt bewaard. Als u de bewerking ongedaan wilt maken, moet u deze statuswijziging ook ongedaan maken. Dit proces kan betrekking hebben op het opnieuw aanroepen van de service en het uitvoeren van een andere actie waarmee de effecten van de eerste worden omgekeerd.

Oplossing

De oplossing is de implementatie van een compenserende transactie. Met de stappen in een compenserende transactie worden de effecten van de stappen in de oorspronkelijke bewerking ongedaan gemaakt. Een intuïtieve benadering is het vervangen van de huidige status door de status waarin het systeem zich aan het begin van de bewerking bevond. Maar een compenserende transactie kan die benadering niet altijd overnemen, omdat er mogelijk wijzigingen worden overschreven die andere gelijktijdige exemplaren van een toepassing hebben aangebracht. In plaats daarvan moet een compenserende transactie een intelligent proces zijn dat rekening houdt met alle werkzaamheden die gelijktijdige instanties uitvoeren. Dit proces is meestal toepassingsspecifiek, afhankelijk van de aard van het werk dat door de oorspronkelijke bewerking wordt uitgevoerd.

Een algemene aanpak is het gebruik van een werkstroom om een uiteindelijke consistente bewerking die compensatie vereist te implementeren. Naarmate de oorspronkelijke bewerking wordt uitgevoerd, registreert het systeem informatie over elke stap, inclusief het ongedaan maken van het werk dat door de stap wordt uitgevoerd. Als de bewerking op enig moment mislukt, wordt de werkstroom teruggespoelen door de stappen die zijn voltooid. Bij elke stap voert de werkstroom het werk uit waarmee die stap wordt omgekeerd.

Twee belangrijke punten zijn:

  • Een compenserende transactie hoeft het werk mogelijk niet ongedaan te maken in de exacte omgekeerde volgorde van de oorspronkelijke bewerking.
  • Het is mogelijk om enkele van de stappen voor ongedaan maken parallel uit te voeren.

Deze aanpak is vergelijkbaar met de Sagas-strategie die wordt besproken in de blog van Clemens Vasters.

Een compenserende transactie is een uiteindelijk consistente bewerking zelf, zodat deze ook kan mislukken. Het systeem moet de compenserende transactie op het moment van de fout kunnen hervatten en doorgaan. Het kan nodig zijn om een stap te herhalen die mislukt, dus moet u de stappen in een compenserende transactie definiëren als idempotente opdrachten. Zie Idempotentiepatronen op de blog van Jonathan Oliver voor meer informatie.

In sommige gevallen is handmatige interventie mogelijk de enige manier om te herstellen van een stap die is mislukt. In deze situaties moet het systeem een waarschuwing genereren en zoveel mogelijk informatie verstrekken over de reden van de fout.

Problemen en overwegingen

Houd rekening met de volgende punten wanneer u besluit hoe u dit patroon implementeert:

  • Het is mogelijk niet eenvoudig om te bepalen wanneer een stap in een bewerking die uiteindelijke consistentie implementeert, mislukt. Een stap mislukt mogelijk niet onmiddellijk. In plaats daarvan wordt het mogelijk geblokkeerd. Mogelijk moet u een time-outmechanisme implementeren.

  • Het is niet eenvoudig om compensatielogica te generaliseren. Een compenserende transactie is toepassingsspecifiek. Het is afhankelijk van de vraag of de toepassing voldoende informatie bevat om de effecten van elke stap in een mislukte bewerking ongedaan te maken.

  • U moet de stappen in een compenserende transactie definiëren als idempotente opdrachten. Als u dit doet, kunnen de stappen worden herhaald als de compenserende transactie zelf mislukt.

  • De infrastructuur die de stappen afhandelt, moet voldoen aan de volgende criteria:

    • Het is tolerant in de oorspronkelijke bewerking en in de compenserende transactie.
    • De informatie die nodig is om een mislukte stap te compenseren, gaat niet verloren.
    • Op betrouwbare wijze wordt de voortgang van de compensatielogica bewaakt.
  • Een compenserende transactie retourneert de systeemgegevens niet noodzakelijkerwijs aan het begin van de oorspronkelijke bewerking. In plaats daarvan compenseert de transactie het werk dat de bewerking is voltooid voordat deze is mislukt.

  • De volgorde van de stappen in de compenserende transactie is niet noodzakelijkerwijs het exacte tegenovergestelde van de stappen in de oorspronkelijke bewerking. Een gegevensarchief kan bijvoorbeeld gevoeliger zijn voor inconsistenties dan een andere. De stappen in de compenserende transactie die de wijzigingen in dit archief ongedaan maken, moeten eerst plaatsvinden.

  • Bepaalde metingen kunnen helpen de kans te vergroten dat de algehele activiteit slaagt. U kunt met name een vergrendeling op korte termijn op basis van time-out plaatsen voor elke resource die nodig is om een bewerking te voltooien. U kunt deze resources ook van tevoren verkrijgen. Voer vervolgens het werk pas uit nadat u alle resources hebt verkregen. Voltooi alle acties voordat de vergrendelingen verlopen.

  • Logica voor opnieuw proberen die meer vergevend is dan normaal, kan helpen bij het minimaliseren van fouten die een compenserende transactie activeren. Als een stap in een bewerking die uiteindelijke consistentie implementeert mislukt, kunt u de fout als tijdelijke uitzondering afhandelen en de stap herhalen. Stop de bewerking en initieer een compenserende transactie alleen als een stap herhaaldelijk mislukt of niet kan worden hersteld.

  • Wanneer u een compenserende transactie implementeert, ondervindt u veel van dezelfde uitdagingen waarmee u te maken krijgt wanneer u uiteindelijke consistentie implementeert. Zie de sectie 'Overwegingen voor het implementeren van uiteindelijke consistentie' in Data Consistency Primer voor meer informatie.

Wanneer dit patroon gebruiken

Gebruik dit patroon alleen voor bewerkingen die ongedaan moeten worden gemaakt als deze mislukken. Ontwerp, indien mogelijk, oplossingen om de complexiteit van het vereisen van compenserende transacties te voorkomen.

Workloadontwerp

Een architect moet evalueren hoe het patroon Compenserende transactie kan worden gebruikt in het ontwerp van hun workload om de doelstellingen en principes te verhelpen die worden behandeld in de pijlers van het Azure Well-Architected Framework. Voorbeeld:

Pijler Hoe dit patroon ondersteuning biedt voor pijlerdoelen
Beslissingen over betrouwbaarheidsontwerp helpen uw workload bestand te worden tegen storingen en ervoor te zorgen dat deze herstelt naar een volledig functionerende status nadat er een fout is opgetreden. Compensatieacties hebben betrekking op storingen in kritieke workloadpaden met behulp van processen zoals het rechtstreeks terugdraaien van gegevenswijzigingen, het verbreken van transactievergrendelingen of zelfs het uitvoeren van systeemeigen systeemgedrag om het effect te omkeren.

- RE:02 Kritieke stromen
- RE:09 Herstel na noodgevallen

Net als bij elke ontwerpbeslissing moet u rekening houden met eventuele compromissen ten opzichte van de doelstellingen van de andere pijlers die met dit patroon kunnen worden geïntroduceerd.

Opmerking

Klanten gebruiken een reiswebsite om itineraries te boeken. Eén route kan bestaan uit een reeks vluchten en hotels. Een klant die van Seattle naar Londen reist en vervolgens naar Parijs gaat, kan de volgende stappen uitvoeren bij het maken van een route:

  1. Boek een stoel op vlucht V1 van Seattle naar Londen.
  2. Boek een stoel op vlucht V2 van Londen naar Parijs.
  3. Boek een stoel op vlucht V3 van Parijs naar Seattle.
  4. Reserveer een kamer in hotel H1 in Londen.
  5. Reserveer een kamer in hotel H2 in Parijs.

Deze stappen vormen een uiteindelijke consistente bewerking, hoewel elke stap uit een aparte actie bestaat. Naast het uitvoeren van deze stappen moet het systeem ook de prestatiemeteritems vastleggen voor het ongedaan maken van elke stap. Deze informatie is nodig voor het geval de klant de route annuleert. De stappen die nodig zijn om de prestatiemeteritems uit te voeren, kunnen vervolgens worden uitgevoerd als een compenserende transactie.

De stappen in de compenserende transactie zijn mogelijk niet het exacte tegenovergestelde van de oorspronkelijke stappen. De logica in elke stap in de compenserende transactie moet ook rekening houden met bedrijfsspecifieke regels. Als u bijvoorbeeld een vluchtreservering annuleert, heeft de klant mogelijk geen recht op een volledige terugbetaling.

In de volgende afbeelding ziet u de stappen in een langlopende transactie voor het boeken van een reisschema. U kunt ook de compenserende transactiestappen zien die de transactie ongedaan maken.

Diagram met de stappen voor het maken van een route. De stappen van de compenserende transactie die het reisschema annuleert, worden ook weergegeven.

Notitie

Mogelijk kunt u de stappen in de compenserende transactie parallel uitvoeren, afhankelijk van hoe u de compenserende logica voor elke stap ontwerpt.

In veel bedrijfsoplossingen is het mislukken van één stap niet altijd nodig om het systeem terug te draaien met behulp van een compenserende transactie. Denk bijvoorbeeld aan het scenario van de reiswebsite. Stel dat de klant vlucht F1, F2 en F3 boekt, maar geen kamer kan reserveren in hotel H1. Het verdient de voorkeur om de klant een kamer in een ander hotel in dezelfde stad aan te bieden in plaats van de vluchten te annuleren. De klant kan nog steeds besluiten om te annuleren. In dat geval wordt de compenserende transactie uitgevoerd en worden de boekingen voor vluchten F1, F2 en F3 ongedaan maken. Maar de klant moet deze beslissing nemen, niet het systeem.

Volgende stappen

  • Inleiding over gegevensconsistentie. Het patroon Compenserende transactie wordt vaak gebruikt om bewerkingen die het uiteindelijke consistentiemodel implementeren ongedaan te maken. Deze primer biedt informatie over de voordelen en afwegingen van uiteindelijke consistentie.
  • Idempotentiepatronen. In een compenserende transactie kunt u het beste idempotente opdrachten gebruiken. In dit blogbericht worden factoren beschreven die u moet overwegen wanneer u idempotentie implementeert.
  • Scheduler Agent Supervisor-patroon. In dit artikel wordt beschreven hoe u flexibele systemen implementeert die bedrijfsactiviteiten uitvoeren die gebruikmaken van gedistribueerde services en resources. In deze systemen moet u soms een compenserende transactie gebruiken om het werk dat een bewerking uitvoert ongedaan te maken.
  • Retry-patroon. Compenserende transacties kunnen rekenkrachtig zijn. U kunt proberen het gebruik ervan te minimaliseren met behulp van het patroon Opnieuw proberen om een effectief beleid voor mislukte bewerkingen te implementeren.
  • Saga gedistribueerde transactiespatroon. In dit artikel wordt uitgelegd hoe u het Saga-patroon gebruikt voor het beheren van gegevensconsistentie tussen microservices in gedistribueerde transactiescenario's. Het Saga-patroon verwerkt het herstel van fouten met compenserende transacties.
  • Patroon Pijpen en filters. In dit artikel wordt het patroon Pijpen en filters beschreven, waarmee u een complexe verwerkingstaak kunt opdelen in een reeks herbruikbare elementen. U kunt het patroon Pipes en Filters gebruiken met het patroon Compenserende transactie als alternatief voor het implementeren van gedistribueerde transacties.
  • Integreer zelfherstel in het ontwerp. In deze handleiding wordt uitgelegd hoe u zelfhersteltoepassingen ontwerpt. U kunt compenserende transacties gebruiken als onderdeel van een zelfherstelbenadering.