강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

박수현님의 프로필 이미지
박수현

작성한 질문수

카프카 완벽 가이드 - 코어편

kafka-consumer-groups 명령어로 Consumer Group과 Consumer, Lag 정보 확인하기

Consumer group 이 지정된 consumer의 auto.offset.reset

작성

·

756

1

강사님 안녕하세요, 강의 잘 듣고 있습니다.

Consumer group에 consumer를 새로 추가하며 테스트를 해보다가, 아래 세 가지 경우에 대해 --from-beginning 옵션을 사용해보았습니다.

  1. consumer group에서 이미 읽어간 적이 있는 topic에 새로운 consumer를 --from-beginning 옵션으로 생성하면 해당 설정이 먹히지 않고 토픽의 처음부터 읽어오지 않습니다.

  2. 새로운 consumer group을 생성하면서 consumer 생성 시 --from-beginning 옵션을 넣으면 토픽의 처음부터 읽어옵니다.

  3. consumer group을 지정하지 않고 consumer 생성 시 --from-beginning 옵션을 넣으면 토픽의 처음부터 읽어옵니다.

auto.offset.reset 설정은 consumer가 topic에 처음 접속하여 message를 가져올 때의 offset 설정이라고 설명해주셨는데, consumer group이 지정된 경우, consumer group 단위로 해당 설정이 먹히는 것인지 문의드립니다. (1번도 consumer가 새로 생성되어 topic에 처음 접속한다고 생각했습니다..)

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

잘 듣고 계시다니 저도 기쁘군요.

답변전에 먼저 해당 토픽이 몇개의 파티션으로 구성되었는지와 Consumer Group이 몇개의 Consumer로 구성되었는지 기재 부탁드립니다.

파티션의 개수보다 Consumer의 개수가 많을 경우 메시지를 할당받지 못할 수 있습니다.

토픽의 생성 스크립트와 Consumer의 생성 스크립트 모두 여기에 올려주셨으면 합니다.

감사합니다.

박수현님의 프로필 이미지
박수현
질문자

넵 아래에 첨부하였습니다!

 


1. 토픽 생성: 파티션 3개
kafka-topics --bootstrap-server localhost:9092 --create --topic multipart-topic --partitions 3

2. 컨슈머그룹 group_01에 첫 번째 컨슈머 생성
kafka-console-consumer --bootstrap-server localhost:9092 --group group_01 --topic multipart-topic \
--property print.key=true --property print.value=true \
--property print.partition=true

3. 메시지 produce
kafka-console-producer --bootstrap-server localhost:9092 --topic multipart-topic \
--property key.separator=: --property parse.key=true < keyload.log

4. 컨슈머그룹 group_01에 두 번째 컨슈머 생성하면서  --from-beginning 옵션 추가
kafka-console-consumer --bootstrap-server localhost:9092 --group group_01 --topic multipart-topic \
--property print.key=true --property print.value=true \
--property print.partition=true --from-beginning

===> 처음부터 읽어오지 않음

5. 컨슈머그룹 group_02에 첫 번쨰 컨슈머 생성하면서  --from-beginning 옵션 추가
kafka-console-consumer --bootstrap-server localhost:9092 --group group_02 --topic multipart-topic \
--property print.key=true --property print.value=true \
--property print.partition=true --from-beginning

===> 처음부터 읽어옴

6. 컨슈머그룹 없는 컨슈머 생성하면서 --from-beginning 옵션 추가
kafka-console-consumer --bootstrap-server localhost:9092 --topic multipart-topic \
--property print.key=true --property print.value=true \
--property print.partition=true --from-beginning

===> 처음부터 읽어옴
권 철민님의 프로필 이미지
권 철민
지식공유자

중요한 부분을 테스트 해보셨군요.

강의 초반부라 consumer group에서 consumer가 읽어들인(또는 읽은) offset 관리 부분은 강의에서 말씀드린 정도만 이해해도 충분하시지만, 좀 더 상세히 말씀드리면(강의 초반부라 아래 설명이 조금 어려울 수 있습니다 ^^)

consumer는 생성 시 consumer group이 할당되어야 합니다. 우리가 kafka-console-consumer 명령어로 consumer를 생성할 때 --group 옵션을 주게 되면 해당 group 명으로 생성된 consumer group이 없다면 해당 group 명으로 consumer group을 생성한 뒤 consumer를 생성해서 해당 group에 할당 시킵니다.

consumer 는 topic을 처음부터 읽을지 아님 특정 offset 이후부터 읽을지 결정하게 되는데, 이를 위해서 내부 토픽인 __consumer_offsets을 참조를 하게 됩니다. __consumer_offsets은 consumer group이 특정 토픽을 어디까지 읽었는지 offset을 기록하고 있습니다. 이때 중요한 것은 consumer가 아니라 consumer group 이 특정 토픽을 어디까지 읽었는지에 대한 정보를 가지고 있다는 점입니다.

만약 __consumer_offsets 내에 해당 consumer group 으로 특정 토픽을 읽은 정보가 없다면 kakfka-console-consumer로 생성된 consumer는 --from-beginning 옵션이 주어질때 해당 토픽의 처음부터 메시지를 읽어 들입니다. --from-beginning 옵션이 없다면 consumer는 토픽에서 신규로 추가되는 메시지부터 읽어 들입니다.

여기서 다시 중요한 것은 해당 consumer group으로 이미 consumer가 --from-begining을 적용하여 토픽 메시지를 읽어들였으면 동일한 consumer group으로 새로운 consumer가 생성이 되어도 이미 읽어들인 메시지를 다시 읽지 않습니다. 왜냐하면 동일한 consumer group으로 이미 첫번째 consumer가 메시지를 읽어들였고, 읽어 들인 메시지의 offset을 내부 토픽인 __consumer_offsets에 기록해 놓았기 때문입니다. 즉 동일한 consumer group내에서는 서로 다른 consumer들의 중복 읽기를 허용하지 않습니다.

그리고 이건 kafka-console-consumer 명령어에 특징인데 해당 명령어는 --group 옵션을 주지 않으면 기존에 살아있는 consumer group이 아닌 임의의 group을 먼저 생성하고 consumer를 해당 group에 할당 시키면서 생성하게 됩니다. 때문에 --group 옵션을 주지 않으면 늘 새로운 consumer group 을 생성하게 되고 --from-beginning을 주면 늘 처음부터 토픽의 메시지를 읽게 됩니다.

다시 강조해서 말씀드리면 consumer가 토픽을 어디까지 읽고 어디서부터 읽어야 할지는 consumer group 단위로 관리되며 이는 __consumer_offsets 토픽의 내용에 기반하고 있습니다.

해당 내용은 뒤 강의에서 보다 자세히 설명드릴 겁니다. 아마 Java 기반 Consumer 구현 실습 및 Consumer 내부 메커니즘 이해 - 01 섹션의 후반부 강의에서 말씀드릴 겁니다.

 

감사합니다.

 

박수현님의 프로필 이미지
박수현
질문자

강사님, 친절한 답변 너무 감사드립니다.

정리하면 "consumer가 토픽을 읽는 정보는 consumer group 단위로 관리되고 __consumer_offsets 에 해당 내용을 저장한다. 동일한 consumer group 내에서는 서로 다른 consumer 들의 중복 읽기를 허락하지 않는다." 네요! 이해했습니다 :)

감사합니다~!

박수현님의 프로필 이미지
박수현

작성한 질문수

질문하기