正確に一度セマンティクス
リスナーコンテナーに 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
が変更されました。