RabbitMQ-meddelanden och asynkrona system · Lektion

Outbox-mönstret för tillförlitlig publicering

Lär er transactional outbox-mönstret för att atomiskt committa verksamhetstillstånd och utgående meddelanden, så att dual-write-problemet i händelsedrivna system elimineras.

Lektion 4 av 413 steg

Outbox-mönstret för tillförlitlig publicering är en gratis lektion i RabbitMQ-meddelanden och asynkrona system på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för RabbitMQ-meddelanden och asynkrona system, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i RabbitMQ-meddelanden och asynkrona system innehåller totalt 4 lektioner.

Problemet med dubbelskrivning

Att spara i en databas och publicera till RabbitMQ är två separata åtgärder. Om den ena lyckas och den andra misslyckas hamnar tillståndet och händelserna ur synk.

Detta kallas problemet med dubbelskrivning.

Vad är outbox-mönstret?

Outbox-mönstret skriver affärsförändringen och det utgående meddelandet i samma databastr ansaktion, och publicerar sedan meddelandet asynkront från outbox-tabellen.

Outbox-tabellen

Skapa en tabell som lagrar väntande meddelanden tillsammans med Era domändata.

CREATE TABLE outbox (
  id UUID PRIMARY KEY,
  payload JSONB,
  published BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMPTZ DEFAULT now()
);

Atomisk skrivning

Uppdatera affärsraden och infoga outbox-raden i samma transaktion. Antingen genomförs båda eller ingen av dem.

BEGIN;
INSERT INTO orders (id, status) VALUES ('42', 'paid');
INSERT INTO outbox (id, payload) VALUES (gen_random_uuid(), '{"order":"42"}');
COMMIT;

Reläprocessen

Ett separat relä (eller en meddelandedistributör) söker regelbundet efter opublicerade rader i outbox-tabellen, publicerar dem till RabbitMQ och markerar dem som publicerade.

Avsökning av outbox-tabellen

Reläet väljer väntande rader i ordning och publicerar dem en i taget.

SELECT id, payload FROM outbox WHERE published = FALSE ORDER BY created_at;

Leverans minst en gång

Om reläet kraschar efter publiceringen men innan raden har markerats publicerar det raden igen vid omstart. Konsumenterna måste därför vara idempotenta så att de klarar dubbletter.

Alternativet Change Data Capture

I stället för avsökning följer verktyg som Debezium databasens write-ahead-logg och strömmar outbox-inlägg till RabbitMQ, vilket minskar fördröjning och belastning.

Kombinera med publisher confirms

Reläet bör använda publisher confirms, så att det bara markerar en rad som publicerad efter att meddelandeförmedlaren har bekräftat meddelandet. På så sätt elimineras fönstret där meddelandet kan gå förlorat.

Outbox kontra saga

Outbox-mönstret garanterar att en enskild tjänst tillförlitligt skickar ut sina händelser. En saga samordnar ett arbetsflöde över flera tjänster. De kompletterar varandra: varje steg i en saga kan publicera via sin egen outbox.

Rensning och bevarande

  • Ta regelbundet bort eller arkivera publicerade rader
  • Skapa ett index på published för snabb avsökning
  • Övervaka reläets fördröjning för att upptäcka stopp tidigt

Snabbkontroll

Testa Era kunskaper om outbox-mönstret.

Sammanfattning

Outbox-mönstret lagrar utgående meddelanden i samma transaktion som affärsdata, varefter ett relä publicerar dem asynkront till RabbitMQ.

Det eliminerar problemet med dubbelskrivning, kräver idempotenta konsumenter på grund av leverans minst en gång och fungerar väl tillsammans med publisher confirms och sagor.

Gratis att börja

Lär dig RabbitMQ-meddelanden och asynkrona system med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
11
Lektioner
44

Vanliga frågor

Är lektionen ”Outbox-mönstret för tillförlitlig publicering” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen RabbitMQ-meddelanden och asynkrona system, inklusive ”Outbox-mönstret för tillförlitlig publicering”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i RabbitMQ-meddelanden och asynkrona system innehåller totalt 4 lektioner.

Vad lär jag mig i ”Outbox-mönstret för tillförlitlig publicering”?

Lär er transactional outbox-mönstret för att atomiskt committa verksamhetstillstånd och utgående meddelanden, så att dual-write-problemet i händelsedrivna system elimineras. Ni övar på RabbitMQ-meddelanden och asynkrona system med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig RabbitMQ-meddelanden och asynkrona system?

Du behöver inga förkunskaper. Utbildningen i RabbitMQ-meddelanden och asynkrona system på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Outbox-mönstret för tillförlitlig publicering”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här RabbitMQ-meddelanden och asynkrona system-lektionen?

Ja. Varje RabbitMQ-meddelanden och asynkrona system-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Idempotens vid meddelandebearbetning
  2. Saga-mönstret med RabbitMQ
  3. Command-Query Responsibility Segregation (CQRS)
  4. Outbox-mönstret för tillförlitlig publicering
← Tillbaka till RabbitMQ-meddelanden och asynkrona system