작성
·
455
0
안녕하세요 강사님!
Consumer와 auto.offset.reset의 내부 동작 메커니즘 상세 이해듣던 중 궁금한 부분이 생겨서 질문 남깁니다 🙂
Kafka Consumer는 __consumer_offsets 기준으로
데이터를 읽어드린다고 이해를 했는데
동일 컨슈머 그룹에 이미 메세지가 있는 경우
프로듀서가 메세지를 전송한 이후에 컨슈머를 기동을 한다고 하면 earlist, lastest 모두 전송한 메세지를 받을 수 없어
데이터 유실이 발생할 가능성이 있을 것 같은데
이러한 데이터 유실을 방지하는 방법이 있을까요?
프로듀서 같은경우 ACK 설정으로 이를 방지할 수 있을 것 같은데 컨슈머에도 동일한 설정이 있는지 궁금합니다.
답변 2
1
안녕하십니까,
제가 질문을 잘 이해하지 못했습니다.
"동일 컨슈머 그룹에 이미 메세지가 있는 경우
프로듀서가 메세지를 전송한 이후에 컨슈머를 기동을 한다고 하면 earlist, lastest 모두 전송한 메세지를 받을 수 없어 데이터 유실이 발생할 가능성이 있을 것 같은데" 에서
동일 컨슈머 그룹에 이미 메시지가 있는 경우가 어떤 의미 인지요? 동일 컨슈머 그룹에 이미 메시지가 있다면, 해당 그룹내의 컨슈머가 이미 메시지를 받아서 읽었다는 걸로 해석한다면, 이미 메시지를 읽고 __consumer_offsets에 읽은 offset을 기록했기 때문에 데이터 유실이 아니라 정상적인 동작입니다만,
해당 내용이 어떤 의미인지 좀 더 자세히 기재해 주시겠습니까?
감사합니다.
0
음 현상을 조금 더 자세히 말씀드리면
__consumer_offsets에 offset을 나타내는 로그 파일 존재
Producer가 먼저 데이터를 1, 2 라는 데이터 전송
Consumer가 기동된적 없음
이러한 상황에서 Consumer를 기동하게 된다면
Producer가 전송한 1, 2 라는 데이터를 Consumer가 poll을 할 수 없어서 해당 데이터는 유실되는 현상을 질문 드렸는데
혹시 제가 맞게 이해한것일까요~?
__consumer_offsets에 offset을 나타내는 로그 파일 존재한다는 의미가 데이터 1, 2를 읽은 OFFSET 번호가 해당 Consumer Group 번호로 기재되어 있다는 건가요? 그럼 해당 데이터는 이미 Consumer가 읽어 들인 것입니다.
그리고 Consumer가 기동된 적 없다는 의미는 해당 Consumer group 번호가 아닌 다른 Consumer Group 으로는 기동한적 없다는 의미인가요? 그럼 해당 consumer로는 데이터를 읽은 적 없으므로 데이터를 poll해서 읽게 됩니다. 유실되지 않습니다.
만약 __consumer_offsets에 offset을 나타내는 로그 파일 존재한다는 의미가 그냥 파일만 있고 아무 기록도 없다면, 어떤 Consumer도 해당 topic의 데이터를 읽지 않았으므로, consumer를 기동하면 해당 topic의 데이터를 poll해서 읽고 __consumer_offsets에 읽은 데이터를 기록하게 됩니다. 데이터는 유실되지 않습니다.