Håndtering av kompensasjon med hendelser
Implementer kompensasjonshandlinger i en koreografert Saga ved å publisere bestemte tilbakerullingshendelser som reverserer tidligere handlinger.
Håndtering av kompensasjon med hendelser er en gratis leksjon i Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker) på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker), og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker) inneholder totalt 4 leksjoner.
Hvorfor kompensasjon er avgjørende
I koreograferte sagaer reagerer tjenester på hendelser. Men hva skjer når en av tjenestene ikke klarer å fullføre sin del av en distribuert transaksjon?
Vi trenger en måte å oppheve handlinger som tidligere tjenester har utført. Det er her kompensasjon kommer inn.
Hva er kompensasjon?
Kompensasjon er prosessen med å reversere tidligere fullførte operasjoner i en distribuert transaksjon. Se på det som en «rollback»-mekanisme tilpasset mikrotjenester.
Den sikrer at systemet kan gå tilbake til en konsistent tilstand hvis et trinn i en forretningsprosess med flere tjenester mislykkes.
Kompensasjon i koreografi
I en koreografert saga finnes det ingen sentral orkestrator. Tjenestene kommuniserer direkte via hendelser. Så hvordan utløser vi kompensasjon?
- Når en tjeneste ikke klarer å fullføre oppgaven sin, publiserer den en bestemt kompensasjonshendelse.
- Andre tjenester som har fullført sin del, lytter etter disse kompensasjonshendelsene.
- Når de mottar en kompensasjonshendelse, utfører de sin egen tilbakerullingslogikk.
Utforme kompensasjonshendelser
Kompensasjonshendelser må inneholde nok informasjon til at tjenester kan utføre tilbakerullingen. Viktige detaljer omfatter ofte:
- Den opprinnelige saga-ID-en eller transaksjons-ID-en.
- Detaljer om den opprinnelige handlingen som må reverseres.
- Data som kreves for å utføre reverseringen (for eksempel beløpet som skal refunderes eller varen som skal frigjøres).
Eksempel: Saga for ordrebehandling
Se for deg en prosess for nettbestillinger:
- Order Service: Oppretter ordren (publiserer
OrderCreated) - Payment Service: Behandler betalingen (publiserer
PaymentProcessed) - Inventory Service: Reserverer lagerbeholdning (publiserer
InventoryReserved)
Hva skjer hvis Inventory Service ikke klarer å reservere lagerbeholdningen?
Starte tilbakerullingen
Hvis Inventory Service ikke klarer å reservere lagerbeholdningen, bør den:
- Ikke publisere
InventoryReserved. - I stedet publisere en kompensasjonshendelse, for eksempel
InventoryReservationFailed.
Denne hendelsen signaliserer til andre tjenester at sagaen ikke kunne fullføres, og at de må oppheve handlingene sine.
Payment Service sin kompensasjon
Payment Service abonnerer på hendelser som indikerer feil. Når tjenesten mottar InventoryReservationFailed, vet den at den må handle:
- Den starter en refusjon for betalingen som tidligere ble behandlet.
- Etter refusjonen kan den publisere en ny hendelse, for eksempel
PaymentRefunded, for å informere andre interesserte tjenester.
Order Service sin kompensasjon
Order Service, som opprettet den opprinnelige ordren, må også reagere. Den kan lytte etter InventoryReservationFailed eller PaymentRefunded.
- Når Order Service mottar en slik hendelse, oppdaterer den ordrestatusen til «Cancelled» eller «Failed».
- Dette sikrer at brukeren ser riktig status for ordren.
Implementere kompensasjonslogikk
Hver tjeneste må inneholde logikk for å håndtere både hendelser som fører prosessen fremover, og bestemte kompensasjonshendelser. Dette innebærer ofte separate hendelsesbehandlere for hver av dem.
Her er et forenklet eksempel på hvordan en Payment Service kan lytte etter en kompensasjonshendelse og utløse en refusjon:
public class PaymentService {
public static void main(String[] args) {
System.out.println("Payment Service Started.");
// Simulate receiving an event from a message broker
String receivedEvent = "InventoryReservationFailed: Order123";
if (receivedEvent.startsWith("InventoryReservationFailed")) {
String orderId = receivedEvent.split(":")[1];
System.out.println("Received compensation event: " + receivedEvent);
System.out.println("Initiating refund for Order ID: " + orderId + "...");
// In a real system, call a payment gateway API to refund
boolean refundSuccess = processRefund(orderId);
if (refundSuccess) {
System.out.println("Refund processed successfully for " + orderId + ".");
// Publish 'PaymentRefunded' event for other services
System.out.println("Publishing PaymentRefunded event.");
} else {
System.out.println("Refund failed for " + orderId + ".");
// Handle refund failure (e.g., alert, manual intervention)
}
} else {
System.out.println("No compensation event received yet.");
}
System.out.println("Payment Service Shutting Down.");
}
private static boolean processRefund(String orderId) {
// Simulate external refund API call
return true; // Assume success for this example
}
}Kort kontroll: Formålet med kompensasjon
I en koreografert saga, hvis «Inventory Service» ikke klarer å reservere varer etter at «Payment Service» har behandlet en betaling, hva er hovedformålet med at «Inventory Service» publiserer en InventoryReservationFailed-hendelse?
Oppsummering: Håndtere kompensasjon
Du har lært hvor viktig kompensasjon er i koreograferte sagaer for å opprettholde datakonsistens i distribuerte systemer. Viktige punkter:
- Kompensasjon reverserer vellykkede handlinger når et sagatrinn mislykkes.
- I koreografi publiserer tjenester bestemte kompensasjonshendelser for å starte tilbakerullinger.
- Hver tjeneste må implementere logikk for å lytte etter og reagere på disse hendelsene ved å utføre sine egne opphevingsoperasjoner.
- Tydelig utforming av hendelser og robust håndtering er avgjørende for motstandsdyktige sagaer.
Lær deg Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker) med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «Håndtering av kompensasjon med hendelser» gratis?
Ja – hele teksten i «Håndtering av kompensasjon med hendelser» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker)-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker) inneholder totalt 4 leksjoner.
Hva lærer jeg i «Håndtering av kompensasjon med hendelser»?
Implementer kompensasjonshandlinger i en koreografert Saga ved å publisere bestemte tilbakerullingshendelser som reverserer tidligere handlinger. Du øver på Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker) med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker)?
Ingen tidligere erfaring er nødvendig. Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker) på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Håndtering av kompensasjon med hendelser»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker)-leksjonen?
Ja. Alle Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker)-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Utforming av hendelsesdrevne Sagaer
- Hendelsesbuss og meldingsbrokere
- Håndtering av kompensasjon med hendelser
- Bygging av idempotente hendelseskonsumenter