私は現在kafka 0.10.0.1を実行しています。問題の2つの値に対応するドキュメントは次のとおりです。
heartbeat.interval.ms- Kafkaのグループ管理機能を使用する場合の、コンシューマーコーディネーターへのハートビート間の予想時間。ハートビートは、コンシューマーのセッションがアクティブなままであることを保証し、新しいコンシューマーがグループに参加または脱退したときに再調整を容易にするために使用されます。値はsession.timeout.msよりも低く設定する必要がありますが、通常はその値の1/3以下に設定する必要があります。さらに低く調整して、通常のリバランスの予想時間を制御できます。
session.timeout.ms- Kafkaのグループ管理機能を使用するときに障害を検出するために使用されるタイムアウト。セッションタイムアウト内にコンシューマのハートビートが受信されない場合、ブローカはコンシューマを失敗としてマークし、グループのバランスを再調整します。ハートビートはpoll()が呼び出されたときにのみ送信されるため、セッションタイムアウトを長くすると、ハード障害を検出する時間が長くなりますが、コンシューマーのポーリングループでメッセージを処理する時間が長くなります。ポーリングループの処理時間を制御する別のオプションについては、max.poll.recordsも参照してください。
なぜドキュメントが_heartbeat.interval.ms
_を_session.timeout.ms
_の1/3に設定することを推奨するのか、私にはわかりません。ハートビートはpoll()
が呼び出されたときにのみ送信されるため、これらの値が同じであっても意味がありません。したがって、現在のレコードの処理が実行されます。
Heartbeat.interval.msは、消費者がハートビート信号を送信する頻度を指定します。したがって、これが3000ミリ秒(デフォルト)の場合、3秒ごとにコンシューマーはハートビート信号をブローカーに送信します。 session.timeout.msは、ブローカーがコンシューマーから少なくとも1つのハートビート信号を受け取る必要がある時間を指定します。さもなければ、それは消費者を死んでいるとマークします。デフォルト値の10000ミリ秒(10秒)では、ブローカーがコンシューマーをデッドとしてマークする前に、3つのハートビート信号の欠落に備えます。高負荷のネットワーク設定では、ハートビート信号をほとんど見逃すのが普通です。そのため、消費者を死んだとマークする前に、3つの心拍信号の欠落を待つことをお勧めします。それが1/3推奨の理由です。
コードは、heartbeat.interval.ms
をrequest.timeout.ms
以上に設定できないというハードリミットを作成します。そうでない場合、Kafkaは「ハートビートはセッションタイムアウトよりも低く設定する必要がある」と不平を言います。
これら2つの構成が実際に同じ値である場合、セッションタイムアウトがハートビートを実行する前にほぼ常に発生するため、ネットワーククライアントがハートビートを実行しない可能性があります。
1/3に関しては、それは一種のヒューリスティック値であると考えるのが好きです。