Gestione degli errori e retry
Gestisca gli errori con retry e code dead-letter.
Gestione degli errori e retry è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Gli errori sono normali
I consumer possono non riuscire: a causa di un errore temporaneo del database, di un timeout di un sistema downstream o di un bug dovuto a dati non validi. MassTransit offre strumenti organizzati su più livelli (retry, redelivery, code degli errori) per gestire gli errori correttamente invece di perdere i messaggi.
Retry immediato
Per brevi interruzioni, configuri il retry affinché MassTransit rielabori il messaggio alcune volte in rapida successione prima di rinunciare.
cfg.ReceiveEndpoint("orders", e =>
{
e.UseMessageRetry(r => r.Immediate(3));
e.ConfigureConsumer<OrderConsumer>(context);
});Retry con intervallo ed esponenziale
Distanziare i tentativi di retry è utile quando il ripristino richiede più tempo. Utilizzi intervalli o un backoff esponenziale, in modo simile a Polly.
e.UseMessageRetry(r =>
r.Exponential(5,
minInterval: TimeSpan.FromSeconds(1),
maxInterval: TimeSpan.FromMinutes(1),
intervalDelta: TimeSpan.FromSeconds(2)));Filtrare gli errori sottoposti a retry
Esegua il retry solo per le eccezioni temporanee; non lo esegua per quelle permanenti, come gli errori di convalida. Utilizzi Handle e Ignore per definire l'ambito dei retry.
e.UseMessageRetry(r =>
{
r.Handle<TimeoutException>();
r.Ignore<ValidationException>();
r.Immediate(3);
});Retry e redelivery a confronto
Retry mantiene il messaggio in memoria e lo rielabora rapidamente. La redelivery (retry ritardato o di secondo livello) restituisce il messaggio al broker affinché venga consegnato nuovamente molto più tardi, liberando nel frattempo il consumer.
e.UseDelayedRedelivery(r =>
r.Intervals(TimeSpan.FromMinutes(5),
TimeSpan.FromMinutes(15),
TimeSpan.FromMinutes(30)));Combinare entrambi i livelli
Una configurazione robusta utilizza il retry immediato per le brevi interruzioni e la redelivery ritardata per le interruzioni più lunghe. Configuri la redelivery all'esterno del retry, in modo che ogni tentativo di redelivery riceva a sua volta i propri retry immediati.
e.UseDelayedRedelivery(r => r.Intervals(
TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15)));
e.UseMessageRetry(r => r.Immediate(3));La coda degli errori
Quando tutti i retry e le redelivery sono esauriti, MassTransit sposta il messaggio in una coda degli errori (denominata <queue>_error). Il messaggio viene conservato con i dettagli dell'eccezione per consentire l'analisi e non viene mai eliminato senza avviso.
Fault
In caso di errore, MassTransit pubblica anche un evento Fault<T>. Altri servizi possono consumare i fault per inviare avvisi, registrare informazioni o attivare la compensazione.
public class OrderFaultConsumer : IConsumer<Fault<OrderPlaced>>
{
public Task Consume(ConsumeContext<Fault<OrderPlaced>> context)
{
// inspect context.Message.Exceptions
return Task.CompletedTask;
}
}L'importanza dell'idempotenza
Poiché retry e redelivery possono elaborare un messaggio più di una volta, i consumer devono essere idempotenti: gestire due volte lo stesso messaggio non deve comportare un doppio addebito o la duplicazione del lavoro. Utilizzi identificativi univoci e controlli di deduplicazione.
Rielaborazione dalla coda degli errori
Dopo aver corretto un bug, può spostare i messaggi dalla coda degli errori alla coda originale per rielaborarli, recuperando il lavoro precedentemente non riuscito.
Code dead-letter e skipped
MassTransit utilizza anche una coda skipped (_skipped) per i messaggi che nessun consumer voleva gestire, aiutando a individuare in produzione i tipi di messaggio instradati in modo errato o imprevisti.
Verifica rapida
Verifichi la gestione degli errori e i retry.
Riepilogo
MassTransit gestisce gli errori su più livelli: retry (immediato o esponenziale, con ambito definito da Handle/Ignore) per le brevi interruzioni, redelivery per le interruzioni più lunghe e una coda degli errori per i messaggi per i quali tutti i tentativi sono esauriti, oltre agli eventi Fault<T> per gli avvisi. Poiché i messaggi possono essere elaborati più di una volta, mantenga i consumer idempotenti e rielabori i messaggi dalla coda degli errori dopo aver corretto i bug.
Domande Frequenti
La lezione «Gestione degli errori e retry» è gratuita?
Sì — il testo completo di «Gestione degli errori e retry» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Gestione degli errori e retry»?
Gestisca gli errori con retry e code dead-letter. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Gestione degli errori e retry»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Concetti di messaggistica
- Produzione e consumo dei messaggi
- Saga e workflow
- Gestione degli errori e retry