RabbitMQ: meddelelser og asynkrone systemer · Lektion

Outbox-mønsteret til pålidelig publicering

Lær det transaktionelle outbox-mønster, så forretningsdata og udgående meddelelser kan committes atomisk, og problemet med dual writes i hændelsesdrevne systemer elimineres.

Lektion 4 af 413 trin

Outbox-mønsteret til pålidelig publicering er en gratis RabbitMQ: meddelelser og asynkrone systemer-lektion på CoddyKit. Dette er lektion 4 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.

Problemet med dobbeltskrivning

Det er to separate handlinger at gemme data i en database og publicere en meddelelse til RabbitMQ. Hvis den ene lykkes, og den anden mislykkes, kommer din tilstand og dine hændelser ud af synkronisering.

Det kaldes problemet med dobbeltskrivning.

Hvad er outbox-mønsteret?

Outbox-mønsteret skriver forretningsændringen og den udgående meddelelse i den samme databasetransaktion og publicerer derefter meddelelsen asynkront fra outbox-tabellen.

Outbox-tabellen

Opret en tabel, der gemmer ventende meddelelser sammen med dine domænedata.

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

Atomisk skrivning

Opdatér forretningsrækken, og indsæt outbox-rækken i én transaktion. Enten gennemføres begge dele, eller også gør ingen af dem.

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

Videresenderprocessen

En separat videresender (eller meddelelsesdistributør) henter upublicerede rækker fra outbox-tabellen, publicerer dem til RabbitMQ og markerer dem som publicerede.

Hentning fra outbox-tabellen

Videresenderen vælger ventende rækker i rækkefølge og publicerer dem én ad gangen.

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

Levering mindst én gang

Hvis videresenderen går ned efter publiceringen, men før rækken markeres, publicerer den meddelelsen igen ved genstart. Derfor skal forbrugerne være idempotente, så de kan håndtere dubletter.

Alternativet ændringsdataregistrering

I stedet for at hente data løbende følger værktøjer som Debezium databasens write-ahead-log og streamer outbox-indsættelser til RabbitMQ, hvilket reducerer latenstid og belastning.

Kombination med bekræftelser

Videresenderen bør bruge bekræftelser fra udgiveren, så den kun markerer en række som publiceret, efter at meddelelsesmægleren har bekræftet meddelelsen. Det lukker vinduet for datatab.

Outbox-mønsteret kontra sagaer

Outbox-mønsteret garanterer, at én tjeneste pålideligt udsender sine hændelser. En saga koordinerer et arbejdsgangforløb på tværs af flere tjenester. De supplerer hinanden: Hvert sagatrin kan publicere via sin egen outbox.

Oprydning og opbevaring

  • Slet eller arkivér publicerede rækker med jævne mellemrum
  • Opret et indeks på published for hurtig hentning
  • Overvåg videresenderens forsinkelse, så du opdager stop tidligt

Hurtigt tjek

Test din forståelse af outbox-mønsteret.

Opsummering

Outbox-mønsteret gemmer udgående meddelelser i den samme transaktion som forretningsdata, hvorefter en videresender publicerer dem asynkront til RabbitMQ.

Det eliminerer problemet med dobbeltskrivning, kræver idempotente forbrugere på grund af levering mindst én gang og fungerer godt sammen med bekræftelser fra udgivere og sagaer.

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 “Outbox-mønsteret til pålidelig publicering” gratis?

Ja — alle 3 lektioner i læringssporet RabbitMQ: meddelelser og asynkrone systemer, inklusive “Outbox-mønsteret til pålidelig publicering”, 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 “Outbox-mønsteret til pålidelig publicering”?

Lær det transaktionelle outbox-mønster, så forretningsdata og udgående meddelelser kan committes atomisk, og problemet med dual writes i hændelsesdrevne systemer elimineres. 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 4 af 4.

Hvor lang tid tager lektionen “Outbox-mønsteret til pålidelig publicering”?

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