일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- broker
- topic
- Elk
- 쿠버네티스
- Helm
- kibana
- consumer group
- kafka broker
- Kubernetes
- Kafka
- tls disable
- Kafka Connect
- Consumer
- offset
- elastic
- create topic
- Message
- Producer
- http
- partition
- minikube
- kafka-connect
- loadbalance
- Produce
- command
- Golang
- k8s
- es
- ElasticSearch
- eck
- Today
- Total
개발자의 개발괴발
[kafka] consumer group 소개 본문
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의 수는 운영 중에 늘릴 순 있지만 줄일 순 없다. 그러므로 처음부터 무리하게 크게 하지 말고 충분할 정도로만 세팅한 후 필요하게 되면 늘리는 것이 좋겠다.
'개발 > kafka' 카테고리의 다른 글
[T.S] consume을 했는데 consume이 안된다? (0) | 2025.03.10 |
---|---|
[kafka] topic config 설정(retention.ms, segment.bytes) (0) | 2025.03.09 |
[kafka] message consume하기 (0) | 2025.03.06 |
[kafka] topic message 확인하기 (0) | 2025.03.04 |
[kafka] message produce하기 (0) | 2025.03.03 |