Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker) · leksjon

Avansert kompensasjonslogikk

Utvikle avansert kompensasjonslogikk for komplekse scenarier, og sørg for datakonsistens selv ved feil.

Leksjon 3 av 410 trinn

Avansert kompensasjonslogikk 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.

Mer avansert kompensasjon

I tidligere leksjoner lærte vi om Saga-mønsteret og hvordan kompensasjonshandlinger reverserer handlinger ved feil. Men hva skjer når feilene er mer komplekse?

Enkle tilbakerullinger er ikke alltid tilstrekkelige i et distribuert system. Vi trenger avansert kompensasjonslogikk for å håndtere kompliserte scenarier og sikre datakonsistens.

Når det enkle ikke er nok

Avansert kompensasjon blir avgjørende når:

  • Delvis gjennomføring: Noen trinn er fullført, mens andre mislyktes, noe som fører til en inkonsistent tilstand.
  • Eksterne systemer: Interaksjoner med tredjepartstjenester som ikke tilbyr umiddelbar tilbakerulling.
  • Ikke-idempotente operasjoner: Handlinger som ikke enkelt kan angres ved å kjøre et grunnleggende kompensasjonstiltak på nytt.
  • Komplekse forretningsregler: Kompensasjonslogikk som avhenger av bestemte betingelser eller data.

Utforming av idempotent kompensasjon

Et avgjørende aspekt ved robust kompensasjon er å gjøre den idempotent. Det betyr at det å kjøre kompensasjonshandlingen flere ganger gir samme resultat som å kjøre den én gang.

Dette er viktig for påliteligheten, siden meldinger kan bli duplisert eller forsøkt på nytt. Kompensasjonslogikken bør alltid kontrollere den gjeldende tilstanden før den forsøker å reversere en handling.

Prøv å kjøre dette eksempelet:

public class OrderService {

    private boolean isRefunded(String orderId) {
        // Simulate checking a database or payment system
        System.out.println("Checking if order " + orderId + " is already refunded...");
        // In a real system, this would query a persistent store
        return false; // For demo, assume not refunded initially
    }

    public void compensateOrderPayment(String orderId) {
        System.out.println("Attempting compensation for order: " + orderId);
        if (isRefunded(orderId)) {
            System.out.println("Order " + orderId + " already refunded. No action needed.");
            return;
        }
        // Simulate refunding logic
        System.out.println("Initiating refund for order: " + orderId);
        // ... actual refund processing ...
        System.out.println("Refund processed for order: " + orderId);
        // In a real system, this would update the 'refunded' status
    }

    public static void main(String[] args) {
        OrderService service = new OrderService();
        String orderId = "ORDER-123";
        service.compensateOrderPayment(orderId);
        System.out.println("\nSimulating a retry or duplicate message:");
        service.compensateOrderPayment(orderId); // Should ideally be idempotent
    }
}

Tilstandsavhengig kompensasjon

Noen ganger avhenger selve kompensasjonshandlingen av den spesifikke feilen eller systemets gjeldende tilstand. Hvis en lagervare for eksempel ble reservert, men ikke sendt, kan det hende at det er nok å frigi reservasjonen i stedet for å behandle en full refusjon.

Dette krever at du legger inn betingede kontroller i kompensasjonslogikken.

Prøv å kjøre dette eksempelet:

public class InventoryService {

    private enum InventoryState { RESERVED, SHIPPED, AVAILABLE }

    private InventoryState getItemState(String itemId) {
        // Simulate checking inventory status from a database
        System.out.println("Checking state for item: " + itemId);
        // In a real system, this would query a persistent store
        return InventoryState.RESERVED; // Let's assume it's reserved for this demo
    }

    public void compensateInventoryReservation(String itemId) {
        System.out.println("Attempting compensation for item: " + itemId);
        InventoryState currentState = getItemState(itemId);

        if (currentState == InventoryState.SHIPPED) {
            System.out.println("Item " + itemId + " was already shipped. Cannot directly un-reserve.");
            System.out.println("Manual intervention or a different compensation for shipped items might be needed.");
        } else if (currentState == InventoryState.RESERVED) {
            System.out.println("Item " + itemId + " is reserved. Releasing reservation.");
            // Simulate releasing the reservation
            System.out.println("Reservation released for item: " + itemId);
        } else {
            System.out.println("Item " + itemId + " is not reserved or is available. No action needed.");
        }
    }

    public static void main(String[] args) {
        InventoryService service = new InventoryService();
        String itemId = "ITEM-456";
        service.compensateInventoryReservation(itemId);
    }
}

Eksterne systemer og kompensasjon

Kompensasjonshandlinger som involverer eksterne tredjepartstjenester (for eksempel betalingsportaler, fraktselskaper og CRM-systemer) medfører unike utfordringer.

  • Ingen direkte tilbakerulling: Du kan ikke direkte «angre» et API-kall til et eksternt system. Du må bruke kompensasjonsmekanismene de tilbyr (for eksempel et refusjons-API eller et kansellerings-API).
  • Asynkron natur: Eksterne systemer kan behandle forespørsler asynkront, noe som gjør det vanskeligere å fastslå den nøyaktige tilstanden ved kompensasjon.
  • Frekvensbegrensninger og tilgjengelighet: Kompensasjonskall kan mislykkes på grunn av problemer i eksterne systemer, noe som krever retry-forsøk og robust feilhåndtering.

Når mennesker må gripe inn

Til tross for våre beste anstrengelser kan enkelte komplekse feil eller kritiske inkonsistenser ikke løses fullstendig av automatisert kompensasjonslogikk alene. Det er her manuell inngripen eller «menneskesagaer» kommer inn i bildet.

En menneskesaga innebærer at en operatør eller et supportteam varsles når en automatisert kompensasjon mislykkes, eller når systemet oppdager en tilstand som ikke kan gjenopprettes. Da kan de rette opp problemet manuelt.

  • Varsling: Sett opp varsler for kompensasjonshandlinger som mislykkes.
  • Dashbord: Gi innsyn i ventende eller mislykkede sagaer.
  • Verktøy: Utvikle interne verktøy for manuell korrigering av data eller for å utløse kompensasjon på nytt.

Kompensasjon i utvikling

Mikrotjenester utvikler seg, og det gjør også datamodellene og forretningslogikken deres. Det betyr at kompensasjonslogikken også må utvikles. Hva skjer med en saga som startet med en eldre versjon av tjenesten, når det oppstår en feil etter en oppdatering?

Strategier for versjonering av kompensasjon:

  • Bakoverkompatibilitet: Utform den nye kompensasjonslogikken slik at den håndterer eldre sagatilstander.
  • Versjonering av sagaer: Lagre versjonen av sagadefinisjonen sammen med sagaens tilstand.
  • Migrering: Ved større endringer bør sagaer som er under behandling, migreres til den nye kompensasjonslogikken hvis det er mulig.

Følg med på kompensasjonen

At et kompensasjonstiltak mislykkes, er en kritisk hendelse. Hvis selve kompensasjonen mislykkes, kan systemet bli stående i en inkonsistent tilstand, noe som kan føre til datakorrupsjon eller negative konsekvenser for virksomheten.

Det er avgjørende å:

  • Loggføre kompensasjonsforsøk: Registrere hver kompensasjonshandling, statusen og eventuelle feil.
  • Overvåke feilrater: Følge med på hvor ofte kompensasjonstiltak mislykkes.
  • Sette opp varsler: Varsle driftsteam umiddelbart hvis antallet kompensasjonsfeil overskrider terskelverdier.
  • Spor kompensasjonsforløp: Bruke distribuert sporing for å forstå hvorfor kompensasjonen mislyktes.

Kompensasjonsutfordringer

Hvilke av følgende er viktige hensyn når du utformer avansert kompensasjonslogikk for mikrotjenester?

Oppsummering: Avanserte tilbakerullinger

Vi har utforsket hvordan du kan gå lenger enn grunnleggende tilbakerullinger og implementere avansert kompensasjonslogikk i mikrotjenestene dine.

  • Vi la vekt på idempotens og betinget logikk for robust kompensasjon.
  • Vi diskuterte kompleksiteten ved eksterne systemer og nødvendigheten av manuell inngripen ved kritiske feil.
  • Til slutt gikk vi gjennom strategier for versjonering og overvåking av kompensasjon for å sikre langsiktig konsistens og pålitelighet.

Å beherske disse teknikkene er avgjørende for å bygge virkelig robuste distribuerte systemer.

Gratis å komme i gang

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 «Avansert kompensasjonslogikk» gratis?

Ja – hele teksten i «Avansert kompensasjonslogikk» 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 «Avansert kompensasjonslogikk»?

Utvikle avansert kompensasjonslogikk for komplekse scenarier, og sørg for datakonsistens selv ved feil. 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 «Avansert kompensasjonslogikk»?

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

  1. Sikre idempotens i Sagaer
  2. Strategier for nye forsøk i Sagaer
  3. Avansert kompensasjonslogikk
  4. Semantiske låser og samtidige sagaer
← Tilbake til Kommunikasjonsmønstre for mikrotjenester (Saga, Circuit Breaker)