0Pricing
C# Academy · レッスン

エラー処理と再試行

再試行とデッドレターキューで障害に対処します。

「エラー処理と再試行」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

障害は起こるもの

コンシューマーでは、データベースの一時的なエラー、下流サービスのタイムアウト、不正なデータによるバグなどが原因で処理が失敗します。MassTransit にはリトライ、再配信、エラーキューなどの段階的なツールが用意されており、メッセージを失うことなく障害を適切に処理できます。

即時リトライ

短時間の一時的な障害には、リトライを設定します。MassTransit は処理を諦める前に、メッセージを短い間隔で数回再処理します。

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

間隔指定と指数バックオフのリトライ

リトライの間隔を空けると、復旧に時間がかかる場合に対応しやすくなります。Polly と同様に、一定間隔または指数バックオフを使用します。

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

リトライ対象のエラーを絞り込む

リトライするのは一時的な例外だけにします。検証エラーのような恒久的なエラーではリトライしないでください。Handle と Ignore を使って、リトライの対象範囲を指定します。

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

リトライと再配信

リトライではメッセージをメモリ上に保持し、すぐに再処理します。再配信(遅延リトライまたは二段階目のリトライ)では、メッセージをブローカーに戻して、かなり後で再び配信します。その間、コンシューマーは解放されます。

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

両方のレイヤーを組み合わせる

堅牢な構成では、一時的な障害に即時リトライを使用し、長時間の停止には遅延再配信を使用します。再配信をリトライの外側に設定すると、再配信された各メッセージにも独自の即時リトライが適用されます。

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

エラーキュー

すべてのリトライと再配信を使い切ると、MassTransit はメッセージをエラーキュー(<queue>_error)へ移動します。メッセージは例外の詳細とともに保持されるため、調査できます。黙って破棄されることはありません。

フォルト

失敗時、MassTransit は Fault<T> イベントもパブリッシュします。他のサービスはフォルトを消費して、アラート、ログ記録、補償処理の開始などを行えます。

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

冪等性が重要

リトライや再配信によってメッセージが複数回処理される可能性があるため、コンシューマーは冪等性を持たなければなりません。同じメッセージを 2 回処理しても、二重請求や処理の重複が発生しないようにします。固有 ID と重複排除チェックを使用します。

エラーキューから再実行する

バグを修正した後、エラーキューから元のキューへメッセージを戻して再処理できます。これにより、以前失敗した処理を復旧できます。

デッドレターキューとスキップキュー

MassTransit は、どのコンシューマーも必要としなかったメッセージのためにスキップキュー(_skipped)も使用します。これにより、本番環境で誤ったルーティングや予期しないメッセージ型を見つけやすくなります。

クイックチェック

エラー処理とリトライをテストします。

まとめ

MassTransit では、障害処理を段階的に構成します。短時間の一時的な障害にはリトライ(即時または指数バックオフ、Handle/Ignore で対象を指定)、長時間の停止には再配信、処理を使い切ったメッセージにはエラーキューを使用し、アラートには Fault<T> イベントを利用します。メッセージは複数回処理される可能性があるため、コンシューマーには冪等性を持たせ、バグを修正した後はエラーキューから再実行します。

よくある質問

「エラー処理と再試行」レッスンは無料ですか?

はい。「エラー処理と再試行」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「エラー処理と再試行」で何を学びますか?

再試行とデッドレターキューで障害に対処します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「エラー処理と再試行」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. メッセージングの概念
  2. メッセージの生成と消費
  3. Sagaとワークフロー
  4. エラー処理と再試行
← C# Academyに戻る