개발자의 개발괴발

[kafka] consumer group 소개 본문

개발/kafka

[kafka] consumer group 소개

휘발성 기억력 2025. 3. 8. 11:54
반응형

consumer group은 마치 하나의 consumer가 동작하는 것 처럼 보이게 한다.

consumer group이 하나가 있다. 이 consumer group에는 두 개의 consumer가 있다. 이때 이 두 consumer가 하나의 topic(파티션이 3개)에서 데이터를 가져온다면 아래 그림처럼 동작할 것이다.

 

Topic에 데이터가 저장이 된 다는 것은 정확하게는 Topic 안의 partition에 저장이 된다. consumer는 이 토픽의 각 partition들을 나눠서 담당한다. consumer는 여러개의 partition을 담당할 수 있다. 그러나 partition은 단 하나의 consumer와 일을 한다. 위 그림처럼 partition의 수가 더 많으면 consumer가 두개 이상의 partition을 담당하기도 한다. 하지만 partition의 수가 consumer의 수보다 더 적다면 몇몇의 consumer는 놀게 된다.

 

이제 partition에 데이터를 넣어보자.

메세지가 partition에 고르게 들어갈 것이라는 생각은 오산이다.(설정을 통해 고르게 들어가게 할 순 있다.) 위와 같은 상황에서는 consumer0가 0, 1, 2, 4, 5, 6번 메세지를 처리하게 되고 consumer 1이 3, 7을 처리하게 된다. 이때 같은 파티션에 있는 메세지들은 순서가 보장이 된다. partition 1번에서 2 4 5 6 순으로 메세지를 받아오지 6 5 4 2, 6 4 5 2 등의 순서로 오진 않는단 뜻이다.

consumer 0와 consumer 1은 같은 그룹이기 때문에 0이 처리한 메세지를 1이 받는 경우는 없다. 다시 말해 consumer 1은 메세지 0, 1을 받을 수 없다.(consumer 0가 죽어서 rebalancing이 일어나면 0, 1을 처리할 수도 있다.)


새로운 consumer group이 들어온다고 해보자.

새로운 그룹 2는 각 partition에 있는 메세지를 처음부터 가져갈 것이다. 그 메세지가 Group1에서 처리했든 말든 그건 상관할 바가 아니다.

위 같은 것은 배달 주문을 예로 들 수 있겠다. 주문자(Producer)가 음식을 배달 주문(Message)을 하면(partition에 메세지 삽입) 음식점(Group1)과 라이더(Group2)가 주문을 확인할 수 있다고 보면 될 것 같다. 음식점과 라이더는 메세지를 각각 처리하면 된다.


테스트 해보기 위해 이 글에서 consumer 부분만 수정을 하고 두개의 consumer를 돌려보겠다.

	group_name := fmt.Sprintf("myGroup_%d", consumerID)
	c, err := kafka.NewConsumer(&kafka.ConfigMap{
		"group.instance.id":  fmt.Sprintf("myGroup_%d", consumerID),
		"bootstrap.servers":  "localhost:9095",
		"group.id":           group_name, // group_name을 다르게 해서 두개의 consumer를 돌려보자
		"auto.offset.reset":  "earliest",
		"enable.auto.commit": false,
	})

출력 내용이 길어서 첨부는 하지 않겠지만 각각의 group에서 메세지를 print하는 것을 볼 수 있다.

kafka consumer 명령어로 확인해보자.

두개의 그룹(myGroup_1, myGroup_2)를 만들었고 이 두개의 그룹이 각각 관리되는 것을 볼 수 있다.

I have no name!@bitnami-kafka-controller-0:/$ kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
myGroup_2
myGroup_1
I have no name!@bitnami-kafka-controller-0:/$ kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group myGroup_1 --describe --members

GROUP           CONSUMER-ID                                    GROUP-INSTANCE-ID HOST            CLIENT-ID       #PARTITIONS
myGroup_1       myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 myGroup_1         /127.0.0.1      rdkafka         20
I have no name!@bitnami-kafka-controller-0:/$ kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group myGroup_2 --describe --members

GROUP           CONSUMER-ID                                    GROUP-INSTANCE-ID HOST            CLIENT-ID       #PARTITIONS
myGroup_2       myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f myGroup_2         /127.0.0.1      rdkafka         20
I have no name!@bitnami-kafka-controller-0:/$ kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group myGroup_1 --describe

GROUP           TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                    HOST            CLIENT-ID
myGroup_1       myTopic         15         7               7               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         16         -               0               -               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         13         7               7               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         14         7               7               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         19         -               0               -               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         17         1               1               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         18         8               8               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         7          7               7               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         8          1               1               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         5          7               7               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         6          -               0               -               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         11         -               0               -               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         12         7               7               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         9          2               2               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         10         8               8               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         0          14              14              0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         3          2               2               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         4          7               7               0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         1          -               0               -               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka
myGroup_1       myTopic         2          14              14              0               myGroup_1-43f553ce-3593-4377-95d4-7ad846f70e45 /127.0.0.1      rdkafka

I have no name!@bitnami-kafka-controller-0:/$
I have no name!@bitnami-kafka-controller-0:/$ kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group myGroup_2 --describe

GROUP           TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                    HOST            CLIENT-ID
myGroup_2       myTopic         15         7               7               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         16         -               0               -               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         13         7               7               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         14         7               7               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         19         -               0               -               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         17         1               1               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         18         8               8               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         7          7               7               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         8          1               1               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         5          7               7               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         6          -               0               -               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         11         -               0               -               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         12         7               7               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         9          2               2               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         10         8               8               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         0          14              14              0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         3          2               2               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         4          7               7               0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         1          -               0               -               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka
myGroup_2       myTopic         2          14              14              0               myGroup_2-8646af06-8ec1-46b7-82bc-e2395e92165f /127.0.0.1      rdkafka

I have no name!@bitnami-kafka-controller-0:/$
I have no name!@bitnami-kafka-controller-0:/$

 


※ partition의 수는 Topic을 생성할때 정할 수 있다. 하나로 해도 되고 20개로 해도 되고 더 많이 해도 된다. 중요한 것은 partition의 수는 운영 중에 늘릴 순 있지만 줄일 순 없다. 그러므로 처음부터 무리하게 크게 하지 말고 충분할 정도로만 세팅한 후 필요하게 되면 늘리는 것이 좋겠다.

 

반응형