1. ホーム
  2. apache-kafka

[解決済み] Kafka >= 0.10.1 における session.timeout.ms と max.poll.interval.ms の差分について

2023-01-10 12:21:41

質問

なぜ両方が必要なのか不明です。 session.timeout.msmax.poll.interval.ms のどちらを使用するのでしょうか、またその両方を使用するのはどのような場合でしょうか。両方の設定は、コーディネーターがコンシューマーが死んだと判断する前にハートビートを取得するために待機する時間の上限を示すように思われます。

に基づくバージョン 0.10.1.0+ では、どのように動作するのでしょうか。 KIP-62 ?

どのように解決するのですか?

KIP-62以前は session.timeout.ms (つまり、Kafka 0.10.0 およびそれ以前)。 max.poll.interval.ms が導入されるのは KIP-62 (カフカの一部 0.10.1 ).

KIP-62では、ハートビートを呼び出しから切り離し poll() の呼び出しからハートビートを切り離し、バックグラウンドのハートビートスレッドを経由して、より長い処理時間(つまり、連続した2つの poll() の間の時間)をハートビート間隔より長くすることができます。

メッセージの処理に1分かかると仮定します。ハートビートとポールが連動している場合 (つまり、KIP-62以前) は、ハートビートとポールの間に session.timeout.ms を 1 分より大きくして、コンシューマがタイムアウトしないようにする必要があります。しかし、コンシューマが死んだ場合、失敗したコンシューマを検出するのにも1分以上かかります。

KIP-62では、ポーリングとハートビートを分離し、連続する2つのポーリングの間にハートビートを送信できるようにしました。このとき、2つのスレッド、ハートビートスレッドと 処理スレッド であり、そのためKIP-62ではそれぞれにタイムアウトを導入しています。 session.timeout.ms がハートビートスレッド用であるのに対し max.poll.interval.ms は処理スレッド用です。

を設定したとします。 session.timeout.ms=30000 を設定したとします。したがって、コンシューマのハートビートスレッドはこの時間が経過する前にブローカにハートビートを送信する必要があります。一方、1つのメッセージの処理に1分かかる場合は max.poll.interval.ms を 1 分より大きく設定し、処理スレッドにメッセージの処理時間を与えることができます。

処理スレッドが死んだ場合、そのスレッドに max.poll.interval.ms を要します。しかし、コンシューマ全体が死んだ場合 (処理スレッドが死ぬと、ハートビートスレッドを含むコンシューマ全体がクラッシュする可能性が高い)、 これを検出するために必要なのは session.timeout.ms で検出できます。

このアイデアは、処理自体にかなりの時間がかかっても、故障したコンシューマを素早く検出できるようにすることです。

実装の詳細

新しいタイムアウト max.poll.interval.ms は主にクライアント側の概念です: もし poll() の中で呼び出されない場合は max.poll.interval.ms の中で呼び出されなかった場合、ハートビートスレッドはこのケースを検出し、 ブローカーにグループからの離脱要求を送信します。-- max.poll.interval.ms はコンシューマーグループのリバランスにまだ関連しています: もしリバランスがトリガーされた場合、コンシューマーは max.poll.interval.ms を呼び出してグループに再参加する時間があります。 poll() を呼び出すことで、グループに再参加することができます。