正確に一度セマンティクス

リスナーコンテナーに KafkaAwareTransactionManager インスタンスを提供できます。そのように構成されている場合、コンテナーはリスナーを呼び出す前にトランザクションを開始します。リスナーによって実行されるすべての KafkaTemplate 操作は、トランザクションに参加します。リスナーがレコード (または BatchMessageListener を使用している場合は複数のレコード) を正常に処理した場合、トランザクションマネージャーがトランザクションをコミットする前に、コンテナーは producer.sendOffsetsToTransaction() を使用してオフセットをトランザクションに送信します。リスナーが例外をスローした場合、トランザクションはロールバックされ、ロールバックされたレコードを次のポーリングで取得できるようにコンシューマーが再配置されます。詳細および繰り返し失敗するレコードの処理については、ロールバック後のプロセッサーを参照してください。

トランザクションを使用すると、Exactly Once Semantics (EOS) が有効になります。

これは、read → process → write シーケンスの場合、シーケンスが 1 回だけ完了することが保証されることを意味します。(読み取りとプロセスには少なくとも 1 回のセマンティクスがあります)。

Spring for Apache Kafka バージョン 3.0 以降は EOSMode.V2 のみをサポートします。

  • V2 - 別名 fetch-offset-request フェンシング (バージョン 2.5 以降)

これには、ブローカーがバージョン 2.5 以降である必要があります。

モード V2 では、コンシューマーメタデータがオフセットとともにトランザクションに送信され、ブローカーは代わりにその情報を使用してプロデューサーがフェンスされているかどうかを判断できるため、各 group.id/topic/partition のプロデューサーを持つ必要はありません。

詳細については、KIP-447 [Apache] (英語) を参照してください。

V2 は以前は BETA でした。フレームワークを KIP-732 [Apache] (英語) に合わせるために EOSMode が変更されました。