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.
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å
publishedfö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.
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
- Idempotens vid meddelandebearbetning
- Saga-mönstret med RabbitMQ
- Command-Query Responsibility Segregation (CQRS)
- Outbox-mönstret för tillförlitlig publicering