エラー処理と再試行
再試行とデッドレターキューで障害に対処します。
「エラー処理と再試行」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- メッセージングの概念
- メッセージの生成と消費
- Sagaとワークフロー
- エラー処理と再試行