Contents
Apache Kafka消費者グループの基本概念と役割
Kafka消費者グループは、リアルタイムデータ処理において欠かせない仕組みです。複数のコンシューマーが協調してメッセージを処理し、負荷分散や再試行を自動化する役割を持っています。本記事では、消費者グループの基本概念、Spring Kafkaでの設定手順、オフセットストレージの管理方法などを解説します。
消費者グループとは
Kafkaでは、消費者グループ(Consumer Group) に属するコンシューマーは同じトピックのメッセージを共有します。例えば1つのトピックが3つに分割されたパーティションを持つ場合、それぞれのパーティションはグループ内の異なるコンシューマーに割り当てられ、並列処理が可能になります。
注意点:同一グループ内では重複した処理が発生しないように設計されているため、グループIDはユニークに設定する必要があります。
データ配信の仕組み
メッセージの配信ルールを図解すると以下の通りです:
- トピックがN個のパーティションを持つ場合、コンシューマー数がN未満でも各パーティションは1つのコンシューマーに割り当てられます。
- コンシューマー数がNを超えると、一部のコンシューマーが無駄になります(例:3つのパーティションに対して4つのコンシューマーを設定)。
| ケース | パーティション数 | コンシューマー数 | 処理結果 |
|---|---|---|---|
| 通常 | 3 | 2 | 各コンシューマーが1〜2パーティションを処理 |
| 超過 | 3 | 4 | 1つのコンシューマーは処理されない |
Spring KafkaでのグループID設定手順
Spring Kafkaを用いる場合、グループIDの設定は基本的な構成です。@EnableKafkaアノテーションとConsumerFactoryのカスタマイズが必要です。
@EnableKafkaの基本構成
以下に簡単な設定例を示します:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
@Configuration @EnableKafka public class KafkaConfig { @Bean public ConsumerFactory<String, String> consumerFactory() { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "my-group-1"); return new DefaultKafkaConsumerFactory<>(props); } } |
この例では、group.id を "my-group-1" として設定し、複数のコンシューマーが同じグループに所属するようにしています。
ConsumerFactoryのカスタマイズ
高可用性を求める場合は、ConsumerFactoryで追加パラメータを指定します。
|
1 2 3 4 5 6 7 8 9 |
Properties props = new Properties(); props.put("enable.auto.commit", "false"); props.put("auto.offset.reset", "earliest"); @Bean public ConsumerFactory<String, String> customConsumerFactory() { return new DefaultKafkaConsumerFactory<>(props); } |
注意:
auto.offset.resetをlatestに設定すると、コンシューマー起動時に最新のメッセージから処理が始まります。
オフセットストレージの設定と管理方法
オフセットストレージの選択は、データの再処理可能性やパフォーマンスに直接影響します。
log vs noneの選択基準
Kafkaではオフセットを保存する方式として以下があります:
| 方式 | 説明 | 用途 |
|---|---|---|
| log | オフセット情報をトピックごとに記録(デフォルト) | データの再処理が必要なケース |
| none | オフセットを保存しない(即時破棄) | 一回限りの処理(例:ログ出力) |
重要:
log方式では、オフセットトピックのレプリケーション係数(offsets.topic.replication.factor)は3以上が推奨されます。
オフセットの自動コミット制御
以下のパラメータで自動コミットを管理できます:
enable.auto.commit: true/false(デフォルト: true)auto.commit.interval.ms: 自動コミット頻度(例: 5000ms)
負荷分散の仕組みと最適なコンシューマー配置戦略
負荷分散は、メッセージ処理能力を最大化するための重要な設計です。
パーティション数とコンシューマー数の関係
Kafkaでは以下のルールが成り立ちます:
- コンシューマー数 = パーティション数 ⇒ 各コンシューマーが1パーティションを担当
- コンシューマー数 > パーティション数 ⇒ 一部のコンシューマーはアイドル状態
- コンシューマー数 < パーティション数 ⇒ 各コンシューマーが複数パーティションを担当
実務例:トピックが5パティションの場合、コンシューマー数を3〜4に設定すると負荷分散効果が高いです。
セッションタイムアウトと再試行ポリシーの最適設定
セッションタイムアウトと再試行戦略は、高可用性を確保するための鍵です。
session.timeout.msの影響範囲
以下のシナリオで挙動が変わるため、ネットワーク環境に応じて設定します:
- 5000ms以下:セッション切れが頻発し、クラスタに再バランスを強制する
- 10000ms以上:障害発見の遅延が生じる可能性あり(例: パーティション再割り当ての遅れ)
推奨値:ネットワークレイテンシを考慮し、
5000~10000ms範囲で設定します。
リトライ戦略の設計ポイント
リトライポリシーは、@KafkaListenerに直接指定できます。
|
1 2 3 4 5 6 7 8 9 10 |
@KafkaListener(topics = "my-topic", groupId = "group-2") public void listen(String message) { try { // 処理ロジック } catch (Exception e) { log.error("処理失敗: {}", e.getMessage()); throw new RuntimeException(e); // 再試行をトリガー } } |
設定ミスを防ぐためのチェックリスト
新規導入時に見落としやすい設定項目をまとめました。以下のPDF形式のチェックリストを参考に、実装段階で確認してください。
- 必須パラメータ確認リスト
group.idbootstrap.servers-
auto.offset.reset -
デバッグ時のよくある罠
- 同じグループIDを持つコンシューマーを複数起動(データの重複処理)
- 自動コミットを有効にしていないのにオフセットが保存されない
設定ミスを防止するため、本文で紹介した項目を網羅したチェックリストをダウンロードしてください。
PDF形式チェックリストはこちら
おわりに
本記事では、Apache Kafka消費者グループの基本概念やSpring Kafkaでの設定手順、オフセット管理などの重要なポイントを取り上げました。実際の運用では、各セクションで述べた内容を参考にしながら、環境に応じて柔軟な設定を行ってください。