みなさんこんにちは、今回は Consumer の基礎や本番環境を運用するうえで欠かせない Consumer groupやこれらを運用していくうえで重要な要素を解説していきたいと思います。
Consumer とは?
Consumerはデータを受け取る役割を持ちますが、前回の図のようにConsumerが1つ1つ独立してデータを受け取るということは少ないです。
本番環境においては、一つのグループ内に含まれる複数のコンシューマがkafkaからデータを受け取るということがセオリーです。
そこで以下ではコンシューマグループについて解説していきます。
Consumer Group
概要
複数のConsumerからなるグループのことを指します。
Topicからメッセージを読み出したいとき、その中のパーティションの数によっては負荷がかかりすぎてしまいます。
そのためTopic内にある複数のpartitionに対し、group内のconsumerにそれぞれ読み込ませることで負荷を分散することが可能です。
Consumer groupでは以下のルールがあります。
- 同じpartitionに割り当てられるコンシューマは一個のみ(複数のコンシューマを割り当てることはできません)
-
partitionの数よりコンシューマが少ない場合、全てのpartitionを読み取れるようにコンシューマが割り当てられる
-
partitionの数よりコンシューマが多い場合、余ったコンシューマは待機する
Consumer Groupの具体的な機能については以下に記載していきます。
Consumer rebalance
何らかの原因でグループ内のconsumerが落ちてしまった場合や新しいconsumerを増やしたい場合、Partitionとconsumerの割り当て関係が変わることを言います。
例えばpartitionが3個、コンシューマが3→2のように、コンシューマが1個増えた場合は、以下のように割り振られ方が変化します。
これがc3が無くなると、
p2,p3のデータをc2が読み込むようになりました。
ちなみにgroup coordinatorと呼ばれるBrokerがrebalanceを行っています。以下でまた解説します。
group coordinator
コンシューマグループを管理するBrokerのことを指します。
具体的には以下のような機能があります
- Consumerに対してpartitionの割り当て
- Consumer offsetの管理
1つ目は、Consumer group内のどのConsumerがpartitionに割り当てられるかを決定し、Consumerの増減もしくはpartitionの増減に応じてConsumer rebalanceを行います。
coordinatorはConsumerが故障していないかを常にチェックしています。そこで故障を検知するとConsumer groupにrebalanceを命令します。
Consumerを増えた場合、新たにConsumer GroupにConsumerが加わったことをcoordinatorに通知することでrebalanceがトリガーされます。
Consumer offset
Consumer groupはどこまでメッセージを読み込んだかを記録するためにOffsetを記録することができます。offsetがあることで、新しく追加されたConsumerがどこから情報を読み取ればいいのかを判断できます。
Offsetの更新、保存はgroup coordinatorで行われており、__consumer_offsetと呼ばれるTopicに保存します。
まとめ
ここではConsumer groupの基本的な機能と、Groupを維持するうえでの重要な機能について解説しました。
ここまでお読みいただきありがとうございました!