Kafkaコンシューマグループのパラメータについて

この記事はKafka Advent Calendar 2021の2日目の記事です。

最近仕事でKafkaコンシューマグループの動作に関わる幾つかのパラメータチューニングをしたので、備忘録として残しておきます。

Kafkaコンシューマーの日本語での説明はKafka コンシューマー — Confluent Documentation の記事が詳しいです。

heartbeat.interval.ms

コンシューマーはグループに参加した後一定間隔でコーディネーター(に指定されたブローカー)にハートビートを送りますが、その間隔を指定するパラーメータです。ハートビートは通常時ではコンシューマーがまだ生きていることをコーディネーターに通知する役割を果たします。リバランスの際にはコーディネーターからコンシューマーにリバランスが発生していること(REBALANCE_IN_PROGRESS)を通知する役割も果たしているため、この値を小さくするとリバランスの時間を短くすることができます。下記の session.timeout.ms の1/3より小さな値が推奨されています。 デフォルトは3秒です。

session.timeout.ms

コーディネーターが一定期間コンシューマーからハートビートを受け取らないとそのコンシューマーは死んだと見なされてグループから追放され、リバランスが発生します。この期間を指定するパラメータです。 デフォルトは10秒です(3.0から45秒になります))。 小さい値にすると既に死んだコンシューマーを早く検知できるというメリットがありますが、実はまだ生きているがGCやネットワーク遅延などの予期せぬトラブルで単にハートビートが少しの期間送れなかっただけという場合もあり、あまり小さすぎる値にすると不必要にリバランスを発生させてしまうので注意が必要です。 ブローカーのgroup.min.session.timeout.msgroup.max.session.timeout.msの範囲内になる必要があります。

ちなみに仕事のプロジェクトではちょっと特殊なケースで、ある制約でパーティションが1つしかないトピックにコンシューマーをスタンバイ2台含めて3台配置してHA構成にしていました。アクティブなコンシューマーが何らかの理由で死んだらなるべく早くスタンバイに切り替わって欲しいのでかなり小さい(1秒) session.timeout.msを設定しようとしたのですが、Confluent Cloudは group.min.session.timeout.ms (デフォルト6秒)をユーザ側で設定できるようになっておらず、6秒以下の値を使うことができないことが判明しました。。

参考

Apache Kafka Data Access Semantics: Consumers and Membership | Confluent