パターンの仕組み
メッセージ処理が失敗した場合、メッセージはバックオフタイムスタンプで再試行トピックに転送されます。次に、再試行トピックコンシューマーはタイムスタンプをチェックし、期限が到来していない場合は、そのトピックのパーティションの消費を一時停止します。期限が来ると、パーティションの消費が再開され、メッセージが再び消費されます。メッセージ処理が再び失敗した場合、メッセージは次の再試行トピックに転送され、処理が成功するか、試行回数が尽きるまでパターンが繰り返され、メッセージはデッドレタートピック (構成されている場合) に送信されます。
たとえば、"main-topic " トピックがあり、1000ms の指数関数的バックオフ、乗数 2、最大試行回数 4 回のノンブロッキング再試行を設定したい場合、main-topic-retry-1000、main-topic-retry-2000、main-topic-retry-4000、main-topic-dlt トピックを作成し、それぞれのコンシューマーを設定します。フレームワークはまた、トピックの作成、リスナーの設定と構成も行います。
この戦略を使用すると、そのトピックに対する Kafka の順序の保証が失われます。 |
好みの AckMode モードを設定できますが、RECORD が推奨されます。 |
asyncAcks
を true に設定して手動 AckMode
を使用する場合、DefaultErrorHandler
は seekAfterError
を false
に設定して構成する必要があります。バージョン 2.9.10、3.0.8 以降、このような構成では、これは無条件に false
に設定されます。以前のバージョンでは、RetryTopicConfigurationSupport.configureCustomizers()
メソッドをオーバーライドしてプロパティを false
に設定する必要がありました。
@Override
protected void configureCustomizers(CustomizersConfigurer customizersConfigurer) {
customizersConfigurer.customizeErrorHandler(eh -> eh.setSeekAfterError(false));
}
さらに、これらのバージョンより前は、asyncAcks
プロパティに関係なく、デフォルト (ロギング) DLT ハンドラーの使用は、いかなる種類の手動 AckMode
とも互換性がありませんでした。