Felhantering och återförsök
Hantera fel med återförsök och dead-letter-köer.
Felhantering och återförsök är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.
Fel är en del av vardagen
Consumers kan misslyckas: ett tillfälligt databasfel, en timeout i ett nedströmsystem eller en bugg som orsakas av felaktiga data. MassTransit erbjuder flera lager av verktyg (retry, redelivery och error queues), så att fel hanteras smidigt i stället för att meddelanden förloras.
Omedelbar retry
Vid kortvariga störningar kan retry konfigureras så att MassTransit behandlar meddelandet igen några gånger i snabb följd innan det ger upp.
cfg.ReceiveEndpoint("orders", e =>
{
e.UseMessageRetry(r => r.Immediate(3));
e.ConfigureConsumer<OrderConsumer>(context);
});Intervall och exponentiell retry
Genom att sprida ut retry-försöken får systemet tid att återhämta sig. Använd intervall eller exponentiell backoff, på liknande sätt som i Polly.
e.UseMessageRetry(r =>
r.Exponential(5,
minInterval: TimeSpan.FromSeconds(1),
maxInterval: TimeSpan.FromMinutes(1),
intervalDelta: TimeSpan.FromSeconds(2)));Filtrera vilka fel som ska återförsökas
Gör endast retry vid tillfälliga undantag. Försök inte igen vid permanenta fel, till exempel valideringsfel. Använd Handle och Ignore för att avgränsa vilka fel som ska omfattas av retry.
e.UseMessageRetry(r =>
{
r.Handle<TimeoutException>();
r.Ignore<ValidationException>();
r.Immediate(3);
});Retry kontra redelivery
Retry behåller meddelandet i minnet och behandlar det igen snabbt. Redelivery (fördröjt återförsök/återförsök på andra nivån) skickar tillbaka meddelandet till brokern, där det levereras igen långt senare. Under tiden frigörs consumern.
e.UseDelayedRedelivery(r =>
r.Intervals(TimeSpan.FromMinutes(5),
TimeSpan.FromMinutes(15),
TimeSpan.FromMinutes(30)));Kombinera båda lagren
En robust konfiguration använder omedelbar retry vid kortvariga störningar och fördröjd redelivery vid längre avbrott. Konfigurera redelivery utanför retry, så att varje redelivery-försök också får sina egna omedelbara retry-försök.
e.UseDelayedRedelivery(r => r.Intervals(
TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15)));
e.UseMessageRetry(r => r.Immediate(3));Error queue
När alla retry- och redelivery-försök är uttömda flyttar MassTransit meddelandet till en error queue (med namnet <queue>_error). Meddelandet bevaras tillsammans med undantagsdetaljer för utredning och tas aldrig bort i tysthet.
Felmeddelanden
Vid ett fel publicerar MassTransit även en Fault<T>-händelse. Andra tjänster kan konsumera felhändelser för att skicka aviseringar, logga eller utlösa kompensation.
public class OrderFaultConsumer : IConsumer<Fault<OrderPlaced>>
{
public Task Consume(ConsumeContext<Fault<OrderPlaced>> context)
{
// inspect context.Message.Exceptions
return Task.CompletedTask;
}
}Idempotens är viktigt
Eftersom retry och redelivery kan behandla ett meddelande mer än en gång måste consumers vara idempotenta: att hantera samma meddelande två gånger får inte leda till dubbel debitering eller duplicerat arbete. Använd unika ID:n och kontroller för deduplicering.
Spela upp meddelanden från error queue
När en bugg har åtgärdats kan meddelanden flyttas från error queue tillbaka till den ursprungliga kön och behandlas igen. På så sätt kan arbete som tidigare misslyckades återställas.
Dead letter- och skipped-köer
MassTransit använder också en skipped-kö (_skipped) för meddelanden som ingen consumer ville ha. Det gör det lättare att upptäcka felroutade eller oväntade meddelandetyper i produktion.
Snabbkontroll
Testa felhantering och retry.
Sammanfattning
MassTransit använder flera lager för felhantering: retry (omedelbar/exponentiell, avgränsad med Handle/Ignore) vid kortvariga störningar, redelivery vid längre avbrott och en error queue för meddelanden där alla försök har uttömts, samt Fault<T>-händelser för aviseringar. Eftersom meddelanden kan behandlas mer än en gång ska consumers vara idempotenta. Meddelanden kan spelas upp från error queue när buggar har åtgärdats.
Lär dig C# 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
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”Felhantering och återförsök” gratis?
Ja – hela texten till ”Felhantering och återförsök” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Felhantering och återförsök”?
Hantera fel med återförsök och dead-letter-köer. Ni övar på C# Academy 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 C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy 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 ”Felhantering och återförsök”?
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 C# Academy-lektionen?
Ja. Varje C# Academy-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
- Grunderna i meddelanden
- Producera och konsumera meddelanden
- Sagor och arbetsflöden
- Felhantering och återförsök