RabbitMQ: meddelelser og asynkrone systemer · Lektion

Saga-mønsteret med RabbitMQ

Implementér Saga-mønsteret til håndtering af langvarige distribuerede transaktioner med RabbitMQ. Orkestrér komplekse arbejdsgange på tværs af flere mikrotjenester på en pålidelig måde.

Lektion 2 af 412 trin

Saga-mønsteret med RabbitMQ er en gratis RabbitMQ: meddelelser og asynkrone systemer-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i RabbitMQ: meddelelser og asynkrone systemer, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. RabbitMQ: meddelelser og asynkrone systemer-kurset indeholder 4 lektioner i alt.

Distribuerede transaktioner afdækket

I mikrotjenester strækker en enkelt forretningshandling sig ofte over flere tjenester. Det kan f.eks. være, at en ordre involverer en ordre-, lager- og betalingstjeneste.

En distribueret transaktion sikrer, at alle disse separate handlinger enten lykkes samlet eller mislykkes samlet, så datakonsistensen bevares i hele systemet.

Ud over tofaset commit

Traditionelle databasetransaktioner bruger ofte en Two-Phase Commit (2PC)-protokol for at sikre atomicitet. 2PC er dog ikke ideel til mikrotjenester, fordi:

  • Den skaber en tæt kobling mellem tjenester.
  • Den kan føre til låse, der holdes i lang tid, hvilket påvirker tilgængeligheden.
  • Den er kompleks at implementere og administrere på tværs af forskellige teknologier.

Vi har brug for en mere fleksibel tilgang til distribuerede systemer.

Introduktion til Saga-mønsteret

Saga-mønsteret er en måde at håndtere distribuerede transaktioner på. I stedet for én atomisk transaktion består en saga af en række lokale transaktioner, hvor hver transaktion opdaterer sin egen tjenestes database.

  • Hver lokal transaktion publicerer en hændelse, når den er fuldført.
  • Disse hændelser udløser det næste trin i sagaen.
  • Hvis et trin mislykkes, bruges kompenserende transaktioner til at fortryde tidligere vellykkede trin.

Målet er eventuel konsistens.

To varianter af Saga

Der er to primære måder at implementere en Saga på:

  • Orkestrering: En central tjeneste, en "Saga-orkestrator", administrerer og styrer arbejdsgangen og fortæller hver deltager, hvad der skal ske som det næste.
  • Koreografi: Hver tjeneste producerer og lytter efter hændelser og beslutter selv, hvad den næste handling skal være, uden en central koordinator.

I denne lektion fokuserer vi på tilgangen med orkestrering, som ofte fungerer godt sammen med meddelelsesmæglere som RabbitMQ.

Sagaens hjerne

Saga-orkestratoren er en dedikeret tjeneste, der har ansvar for:

  • At modtage den indledende kommando (f.eks. "Opret ordre").
  • At sende kommandoer til sagaens deltagere (mikrotjenester).
  • At lytte efter hændelser fra deltagerne.
  • At vedligeholde sagaens tilstand.
  • At beslutte det næste trin eller starte kompenserende transaktioner, hvis et trin mislykkes.

RabbitMQ er perfekt til, at orkestratoren kan sende kommandoer og modtage hændelser.

Deltagere og lokale transaktioner

En Saga-deltager er en mikrotjeneste, der indgår i den distribuerede transaktion. Når den modtager en kommando fra orkestratoren, gør den følgende:

  1. Udfører sin egen lokale ACID-transaktion.
  2. Opdaterer sin database.
  3. Publicerer en hændelse (f.eks. "OrderCreatedEvent" eller "StockReservedEvent"), der angiver, om handlingen lykkedes eller mislykkedes.

Disse hændelser er afgørende for, at orkestratoren kan fortsætte sagaen.

Fortryd handlinger: Kompensation

Hvad sker der, hvis et trin i sagaen mislykkes? Det er her, kompenserende transaktioner kommer ind i billedet. Det er handlinger, der er designet til at vende virkningerne af tidligere fuldførte lokale transaktioner.

Hvis trinnet "Behandl betaling" f.eks. mislykkes, kan en kompenserende transaktion for "Reservér lager" være at frigive de reserverede varer tilbage til lagerbeholdningen.

Det sikrer, at systemet vender tilbage til en konsistent tilstand, selv om det ikke rulles helt tilbage.

Orkestratoren starter

Forestil dig en saga, der opretter en ordre. Orkestratoren modtager en anmodning og sender en kommando til den første deltager (f.eks. "Order Service"). Her er et forenklet Java-eksempel:

public class OrderSagaOrchestrator {
  public void startOrderCreationSaga(String orderId, String userId, double amount) {
    System.out.println("Orchestrator: Starting saga for Order " + orderId);
    // Simulate sending a message to Order Service
    String command = "CreateOrderCommand { orderId: " + orderId + ", userId: " + userId + ", amount: " + amount + " }";
    System.out.println("Orchestrator: Sending command to Order Service: " + command);
    // In a real app, this would be a RabbitMQ message send
  }

  public static void main(String[] args) {
    OrderSagaOrchestrator orchestrator = new OrderSagaOrchestrator();
    orchestrator.startOrderCreationSaga("ORD-001", "user123", 99.99);
  }
}

Deltageren svarer

Lad os nu se på "Order Service" (en deltager), der modtager kommandoen. Den behandler ordren lokalt og publicerer derefter en hændelse.

public class OrderServiceParticipant {
  public void handleCreateOrderCommand(String commandMessage) {
    System.out.println("OrderService: Received command: " + commandMessage);
    // Simulate local transaction (e.g., save order to DB)
    String orderId = "ORD-001"; // Extract from commandMessage in real app
    System.out.println("OrderService: Successfully created local order " + orderId);

    // Simulate publishing an event back to the orchestrator
    String event = "OrderCreatedEvent { orderId: " + orderId + ", status: 'PENDING_PAYMENT' }";
    System.out.println("OrderService: Publishing event: " + event);
    // In a real app, this would be a RabbitMQ message publish
  }

  public static void main(String[] args) {
    OrderServiceParticipant participant = new OrderServiceParticipant();
    participant.handleCreateOrderCommand("CreateOrderCommand { orderId: ORD-001, userId: user123, amount: 99.99 }");
  }
}

Orkestratoren fortsætter flowet

Orkestratoren lytter efter hændelser som OrderCreatedEvent. Når den modtager en sådan hændelse, opdaterer den sagaens tilstand og sender den næste kommando, måske til en "Inventory Service" for at reservere lager.

public class OrderSagaOrchestratorContinued {
  public void handleOrderCreatedEvent(String eventMessage) {
    System.out.println("Orchestrator: Received event: " + eventMessage);
    String orderId = "ORD-001"; // Extract from eventMessage
    // Update saga state (e.g., mark order as 'OrderCreated')

    // Decide next step: send command to Inventory Service
    String command = "ReserveStockCommand { orderId: " + orderId + ", productId: 'PROD-A', quantity: 2 }";
    System.out.println("Orchestrator: Sending command to Inventory Service: " + command);
  }

  public static void main(String[] args) {
    OrderSagaOrchestratorContinued orchestrator = new OrderSagaOrchestratorContinued();
    orchestrator.handleOrderCreatedEvent("OrderCreatedEvent { orderId: ORD-001, status: 'PENDING_PAYMENT' }");
  }
}

Kontrol af Sagaens grundelementer

Hvilke af følgende er vigtige komponenter eller egenskaber ved mønsteret Saga-orkestrering?

Saga for pålidelighed

Saga-mønsteret er en effektiv måde at håndtere komplekse, langvarige distribuerede transaktioner i mikrotjenestearkitekturer på.

  • Det muliggør eventuel konsistens uden tæt kobling.
  • Det bruger lokale transaktioner og kompenserende transaktioner for at opnå modstandsdygtighed.
  • RabbitMQ udgør det ideelle fundament for, at orkestratoren og deltagerne kan kommunikere pålideligt via kommandoer og hændelser.

Sagaer øger kompleksiteten, men er afgørende for at bygge robuste distribuerede systemer.

Gratis at komme i gang

Lær RabbitMQ: meddelelser og asynkrone systemer med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
11
Lektioner
44

Ofte stillede spørgsmål

Er lektionen “Saga-mønsteret med RabbitMQ” gratis?

Ja — alle 3 lektioner i læringssporet RabbitMQ: meddelelser og asynkrone systemer, inklusive “Saga-mønsteret med RabbitMQ”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. RabbitMQ: meddelelser og asynkrone systemer-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Saga-mønsteret med RabbitMQ”?

Implementér Saga-mønsteret til håndtering af langvarige distribuerede transaktioner med RabbitMQ. Orkestrér komplekse arbejdsgange på tværs af flere mikrotjenester på en pålidelig måde. Du øver dig i RabbitMQ: meddelelser og asynkrone systemer med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på RabbitMQ: meddelelser og asynkrone systemer?

Der kræves ingen tidligere erfaring. RabbitMQ: meddelelser og asynkrone systemer på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Saga-mønsteret med RabbitMQ”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne RabbitMQ: meddelelser og asynkrone systemer-lektion?

Ja. Alle RabbitMQ: meddelelser og asynkrone systemer-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Idempotens i meddelelsesbehandling
  2. Saga-mønsteret med RabbitMQ
  3. Adskillelse af kommandoer og forespørgsler (CQRS)
  4. Outbox-mønsteret til pålidelig publicering
← Tilbage til RabbitMQ: meddelelser og asynkrone systemer