0Pricing
C# Academy · Lekcja

Obsługa błędów i ponawianie prób

Obsługuj błędy za pomocą ponawiania prób i kolejek dead-letter.

Obsługa błędów i ponawianie prób to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Błędy są czymś normalnym

Konsumenci mogą kończyć się błędem: z powodu przejściowego błędu bazy danych, przekroczenia limitu czasu systemu zależnego lub błędu w danych. MassTransit udostępnia wielowarstwowe mechanizmy, takie jak ponowienia, ponowne dostarczanie i kolejki błędów, dzięki czemu błędy są obsługiwane poprawnie zamiast prowadzić do utraty wiadomości.

Natychmiastowe ponowienie

W przypadku krótkotrwałych zakłóceń należy skonfigurować ponowienie, aby MassTransit ponownie przetworzył wiadomość kilka razy w krótkich odstępach, zanim zrezygnuje.

cfg.ReceiveEndpoint("orders", e =>
{
    e.UseMessageRetry(r => r.Immediate(3));
    e.ConfigureConsumer<OrderConsumer>(context);
});

Ponowienia ze stałym i wykładniczym odstępem

Odstępy między ponowieniami pomagają, gdy przywrócenie działania trwa dłużej. Należy użyć stałych odstępów lub wykładniczego zwiększania odstępów, podobnie jak w bibliotece Polly.

e.UseMessageRetry(r =>
    r.Exponential(5,
        minInterval: TimeSpan.FromSeconds(1),
        maxInterval: TimeSpan.FromMinutes(1),
        intervalDelta: TimeSpan.FromSeconds(2)));

Filtrowanie błędów podlegających ponowieniu

Należy ponawiać tylko w przypadku wyjątków przejściowych, a nie trwałych, takich jak błędy walidacji. Do ograniczania zakresu ponowień służą Handle i Ignore.

e.UseMessageRetry(r =>
{
    r.Handle<TimeoutException>();
    r.Ignore<ValidationException>();
    r.Immediate(3);
});

Ponowienie a ponowne dostarczenie

Ponowienie zachowuje wiadomość w pamięci i szybko przetwarza ją ponownie. Ponowne dostarczenie (opóźnione ponowienie lub ponowienie drugiego poziomu) zwraca wiadomość do brokera, aby została dostarczona ponownie znacznie później, zwalniając w międzyczasie konsumenta.

e.UseDelayedRedelivery(r =>
    r.Intervals(TimeSpan.FromMinutes(5),
                TimeSpan.FromMinutes(15),
                TimeSpan.FromMinutes(30)));

Łączenie obu warstw

Solidna konfiguracja korzysta z natychmiastowych ponowień w przypadku krótkotrwałych zakłóceń oraz opóźnionego ponownego dostarczania podczas dłuższych awarii. Ponowne dostarczanie należy skonfigurować poza warstwą ponowień, aby każda próba ponownego dostarczenia również otrzymywała własne natychmiastowe ponowienia.

e.UseDelayedRedelivery(r => r.Intervals(
    TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15)));
e.UseMessageRetry(r => r.Immediate(3));

Kolejka błędów

Gdy wszystkie ponowienia i ponowne dostarczenia zostaną wyczerpane, MassTransit przenosi wiadomość do kolejki błędów o nazwie <queue>_error. Wiadomość jest zachowywana wraz ze szczegółami wyjątku do czasu zbadania problemu i nigdy nie jest po cichu odrzucana.

Komunikaty o błędach

W przypadku niepowodzenia MassTransit publikuje również zdarzenie Fault<T>. Inne usługi mogą odbierać komunikaty o błędach, aby wysyłać alerty, rejestrować informacje lub uruchamiać kompensację.

public class OrderFaultConsumer : IConsumer<Fault<OrderPlaced>>
{
    public Task Consume(ConsumeContext<Fault<OrderPlaced>> context)
    {
        // inspect context.Message.Exceptions
        return Task.CompletedTask;
    }
}

Znaczenie idempotentności

Ponieważ ponowienia i ponowne dostarczanie mogą spowodować przetworzenie wiadomości więcej niż raz, konsumenci muszą być idempotentni: dwukrotne obsłużenie tej samej wiadomości nie może spowodować podwójnego obciążenia ani zduplikowania pracy. Należy używać unikatowych identyfikatorów i sprawdzania duplikatów.

Ponowne odtwarzanie z kolejki błędów

Po naprawieniu błędu można przenieść wiadomości z kolejki błędów z powrotem do pierwotnej kolejki, aby przetworzyć je ponownie i odzyskać wcześniej niezrealizowaną pracę.

Kolejki dead-letter i pominiętych wiadomości

MassTransit korzysta również z kolejki pominiętych wiadomości (_skipped) dla wiadomości, których żaden konsument nie chciał odebrać. Pomaga to wykrywać w środowisku produkcyjnym wiadomości skierowane do niewłaściwego miejsca lub nieoczekiwane typy wiadomości.

Szybkie sprawdzenie

Przetestowanie obsługi błędów i ponowień.

Podsumowanie

MassTransit stosuje warstwową obsługę błędów: ponowienie (natychmiastowe lub wykładnicze, ograniczane za pomocą Handle/Ignore) w przypadku krótkotrwałych zakłóceń, ponowne dostarczanie podczas dłuższych awarii oraz kolejkę błędów dla wiadomości, których obsługa zakończyła się niepowodzeniem, a także zdarzenia Fault<T> do wysyłania alertów. Ponieważ wiadomości mogą być przetwarzane więcej niż raz, konsumenci powinni być idempotentni, a po naprawieniu błędów należy ponownie odtworzyć wiadomości z kolejki błędów.

Często zadawane pytania

Czy lekcja „Obsługa błędów i ponawianie prób” jest bezpłatna?

Tak — pełny tekst „Obsługa błędów i ponawianie prób” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Obsługa błędów i ponawianie prób”?

Obsługuj błędy za pomocą ponawiania prób i kolejek dead-letter. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Obsługa błędów i ponawianie prób”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Koncepcje komunikacji
  2. Produkcja i konsumpcja komunikatów
  3. Sagi i przepływy pracy
  4. Obsługa błędów i ponawianie prób
← Powrót do C# Academy