コンシューマークライアントでリバランスが頻繁にトリガーされる場合、主な原因は通常、メッセージ処理の遅延、コンシューマーパラメーターの不適切な設定、または古いクライアントバージョンです。このトピックでは、クライアントのバージョン別に原因を説明し、ソリューションを提供します。
現象
ApsaraMQ for Kafka を使用しているコンシューマークライアントで、リバランスが頻繁に発生します。
原因
原因はクライアントのバージョンによって異なります。
バージョン 0.10.2 より前のクライアント:コンシューマーには独立したハートビート用のスレッドがありません。ハートビートは
poll()メソッドを通じて送信されます。メッセージ処理に時間がかかりすぎると、ハートビートリクエストがタイムアウトし、リバランスがトリガーされます。バージョン 0.10.2 以降のクライアント:独立したハートビート用のスレッドが存在します。ただし、
max.poll.interval.msで指定された時間が経過してもメッセージがプルされない場合、クライアントはコンシューマーグループから離脱し、リバランスがトリガーされます。max.poll.interval.msのデフォルト値は 5 分です。
主要なパラメーター
以下のパラメーターは、リバランスの動作をコントロールします。
| パラメーター | 適用バージョン | 説明 |
|---|---|---|
session.timeout.ms | すべて | セッションのタイムアウト。この期間内にハートビートが受信されない場合、ブローカーはコンシューマーをコンシューマーグループから削除します。 |
max.poll.records | すべて | poll() メソッドの 1 回の呼び出しで返されるメッセージの最大数。 |
max.poll.interval.ms | 0.10.2 以降 | poll() メソッドの 2 回の連続した呼び出しの最大間隔。この間隔を超えると、コンシューマーはコンシューマーグループから離脱し、リバランスがトリガーされます。 |
ソリューション
パラメーター値の調整
クライアントのバージョンに基づいて、以下のパラメーターを設定します。
session.timeout.msクライアントバージョン 推奨値 0.10.2 より前 メッセージのバッチを処理する時間より長く、かつ 30 秒以下に設定します。25 秒を推奨します。 0.10.2 以降 デフォルト値の 10 秒を維持します。 max.poll.recordsこの値は、次の数式の結果よりも十分に小さく設定してください。
max.poll.records << messages_per_thread_per_second * number_of_threads * max.poll.interval.msmax.poll.interval.ms(バージョン 0.10.2 以降のみ)この値は、次の数式の結果よりも大きく設定してください。
max.poll.interval.ms > max.poll.records / (messages_per_thread_per_second * number_of_threads)消費速度の向上と処理スレッドの分離
消費ロジックに独立したスレッドを割り当てることで、メッセージの処理速度を向上させます。これにより、処理の遅延がハートビートをブロックしたり、ポーリング間隔を超えたりすることを防ぎます。
コンシューマーグループあたりのトピック数の削減
各コンシューマーグループがサブスクライブするトピックの数を減らします。コンシューマーグループごとにサブスクライブするトピックは 5 つ以下にしてください。安定性を最適化するためには、コンシューマーグループごとに 1 つのトピックをサブスクライブすることを推奨します。
バージョン 0.10.2 以降へのアップグレード
0.10.2 より前のバージョンのクライアントを使用している場合は、バージョン 0.10.2 以降にアップグレードしてください。新しいバージョンでは独立したハートビート用のスレッドが使用されるため、処理遅延によるハートビートのタイムアウトを防ぐことができます。