[Apache Kafka] 3 - Consumer Groups(컨슈머 그룹)

leeng·2024년 7월 1일
0

kafka

목록 보기
3/4

1. Consumer에게 group 지정하기 / group 확인하기

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic third_topic --group 그룹명으로 그룹을 지정하면 된다.

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic first_topic --group my-first-group

아래와 같이 kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list 명령어를 통해 컨슈머 그룹 목록을 조회하여 my-first-group 그룹이 생성된 것을 확인할 수 있다.

--describe --group 그룹명 옵션을 이용하면 더 자세한 정보를 확인할 수도 있다.


2. Consumer Group과 Offset

앞선 포스팅에서 컨슈머 콘솔에 --from-beginning 옵션을 주게 되면 해당 토픽의 처음부터 메시지를 읽어온다고 설명한 바 있다.
마찬가지로 컨슈머 그룹을 설정한 후 --from-beginning 옵션을 주게 되면 토픽의 처음부터 메시지를 읽어온다.

이번에는 동일하게 my-first-group 그룹에 속한 두번째 컨슈머 콘솔을 실행하면서 --from-beginning 옵션을 전달해보자.

그러면 두번째 컨슈머는 메시지를 처음부터 읽어오지 못하는 것을 확인할 수 있을 것이다.
그 이유는 카프카는 --from-beginning 옵션이 전달되어도 그룹의 일부로 커밋된 offset이 없는 경우에만 처음부터 읽어오기 때문에 동일한 그룹 이름으로 또 --from-beginning 옵션을 줘도 처음부터 읽어오지 않는 것이다.

offset이란?

파티션 내에서 메시지의 순서를 나타내는 고유한 정수 값으로
offset을 commit한다는 것은 컨슈머가 메시지를 읽고 처리한 후에, 메시지를 마지막으로 어디까지 읽었는지 저장하는 것이다.
Kafka는 offset을 각 컨슈머 그룹 별로 관리한다.

참고로 컨슈머 그룹에 커밋된 offset이 존재하는 경우에 처음부터 읽어오지 않는다는 것은 결국 해당 컨슈머 그룹의 offset을 초기화시키면 메시지를 처음부터 읽는다는 것이다.
아래 명령어를 통해 offset을 reset할 수 있다.

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group my-first-group --reset-offsets --to-earliest --topic first_topic --execute

offset을 초기화시킨 후 다시 해당 그룹에 --from-beginning 옵션을 주면 메시지를 처음부터 읽어오는 것을 확인할 수 있다.


3. Consumer group과 파티션

컨슈머 그룹과 오프셋의 관계를 살펴보았으니 이번에는 컨슈머 그룹과 파티션의 관계를 살펴보자.

컨슈머 그룹과 토픽의 파티션의 관계는 어떻게 될까?

컨슈머 그룹 내의 컨슈머는 해당 토픽 내의 파티션을 나눠가진다.
만약 컨슈머의 수가 파티션의 수보다 작으면 하나의 컨슈머가 1 개 이상의 파티션을 담당하게 되고, 컨슈머의 수와 파티션의 수가 같으면 하나의 컨슈머 당 하나의 파티션을 담당하게 된다. 그리고 만약 컨슈머의 수가 파티션의 수보다 크면 담당하는 파티션 없이 놀고 있는 컨슈머가 존재하게 되는 것이다.

예시를 통해 확인해보자.

1) 파티션이 5개인 'multiple_partiton_topic' 생성

2) 'multiple_partiton_group' 그룹에 속한 하나의 컨슈머 생성

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic multiple_partiton_topic --group multiple_partiton_group -- 컨슈머 생성

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group multiple_partiton_group --describe -- 컨슈머 그룹에 대한 정보 확인

--describe 옵션을 통해 해당 컨슈머 그룹에 대한 정보를 조회한 결과, console-consumer-da1de9ad-ce7d-4fb7-8113-a269fd8d9d11라는 ID를 가진 하나의 컨슈머가 5개의 파티션(0,1,2,3,4)을 담당하고 있는 것을 확인할 수 있다.

3) 'multiple_partiton_group' 그룹에 속한 컨슈머를 추가로 2개 생성(total 3개)

컨슈머를 추가로 2개 더 생성한 후 컨슈머 정보를 조회한 결과이다.

console-consumer-198de97a-792c-4cfc-bd5a-62b664df4ce7가 파티션 0, 1을 담당하고
console-consumer-d112d1d7-3282-4d67-afd7-00cefc51a65d가 파티션 2, 3을 담당하고
console-consumer-da1de9ad-ce7d-4fb7-8113-a269fd8d9d11가 파티션 4를 담당하고 있는 것을 확인할 수 있다.

4) 'multiple_partiton_group' 그룹에 속한 컨슈머를 추가로 2개 생성(total 5개)

multiple_partiton_group 그룹의 컨슈머를 2개 더 생성하여 컨슈머의 수가 토픽의 파티션 수인 5개가 되었다. 이제는 각 컨슈머가 하나의 파티션을 담당하게 되었다.

5) 'multiple_partiton_group' 그룹에 속한 컨슈머를 추가로 2개 생성(total 7개)

multiple_partiton_group 그룹의 컨슈머를 2개 더 생성하여 컨슈머의 수는 파티션의 수보다 많은 7개가 되었다.
참고로 추가로 컨슈머를 더 생성해도 하나의 파티션은 하나의 컨슈머에만 속한다. 하나의 파티션을 여러 개의 컨슈머가 담당하지는 않는다.

아래는 컨슈머를 2개 더 추가한 후에 다시 컨슈머 그룹의 정보를 조회한 결과이다. 여전히 하나의 컨슈머는 하나의 파티션을 담당하고 있는 것을 확인할 수 있다. 하지만 자세히 보면 4번에서 조회한 파티션 - 컨슈머ID 조합과 현재의 조합이 달라진 것을 알 수 있다.

그 이유는 컨슈머 그룹에 컨슈머가 새로 추가되거나 나가면(토픽에 새로운 파티션이 추가될 때도) 리밸런싱이 일어나기 때문이다. 파티션을 컨슈머에게 재할당하는 것이다.(참고로 리밸런싱에도 여러 전략이 존재한다. 여기서 설명하기에는 너무 길어지므로 생략...)


profile
기술블로그보다는 기록블로그

0개의 댓글