본문 바로가기
Kafka

Kafka auto commit

by 스르나 2021. 11. 23.

Kafka는 읽어들인 페이로드를 어디까지 읽었는지 자동으로 commit할 수 있는 auto.commit 옵션이 있다.

 

  • enable.auto.commit = true
  • auto.commit.interval.ms = ms

 

위 두 옵션을 통해 설정을 하는데 이 옵션이 편리해 보이지만 메세지를 중복 혹은 손실할 가능성이 생긴다.

 

가장 큰 이유는 카프카 컨슈머 그룹의 '리밸런싱' 과정에서 생기는데, 먼저 리밸런싱이 무엇인지 간략하게 설명하자면

 

카프카의 토픽의 파티션은 컨슈머 그룹의 컨슈머가 '독점'하는 형식이다.

 

만약 그룹내의 한 컨슈머가 문제가 발생한다면 해당 그룹은 파티션 하나 혹은 그이상을 이용할 수 없는 상태가 된다.

 

그렇게 된다면 메세지의 순서가 틀리게 되고, 서비스 장애로 이어질 수 있다.

 

그래서 카프카는 컨슈머 그룹에 컨슈머들이 정상적인 상태인지 체크를 하고, 이때 비정상적인 상태의 컨슈머가 존재한다면 리밸런싱이 일어나는데, 이때 리밸런싱은 컨슈머 그룹내의 컨슈머들과 카프카 사이의 연결을 모두 끊어 버리고 재 할당 하는 것이다.

 

만약 죽어 있던 컨슈머하나가 다시 살아나서 카프카에 붙으려고 하면 이번에는 컨슈머를 추가하기 위한 리밸런싱이 일어난다.

 

 

이때 컨슈머가 메세지를 소비하고 있던 상태라면 커밋을 제대로 하지 못한채로 연결이 끊기기 때문에 읽어 들이고 커밋하지 않은 메세지를 다시 소비하는 과정이 생길 수 있다.

 

반대로 메세지를 처리하지도 않았는데 커밋을 해서 손실할 경우도 생긴다.

 

 

그럼 auto.commit 시간이 짧고 김에 따라 생길 수 있는 상황을 보자

메세지 처리 시간에 비해 너무 짧은 시간

 

kafka auto commit 시간을 짧게 잡는다면 e,f 메세지를 처리하던 중 에러가 발생했을때  e,f 를 다시 처리하여야 하지만 commit을 해버려서 재처리를 못해 손실될 수 있다.

 

 

메세지 처리 시간에 비해 너무 긴 시간

 

반대의 경우는 메세지를 읽었지만 커밋하기 까지 시간이 길어서 그 사이 시간에 리밸런싱이 일어나서 커밋을 못하고 다시 읽어 들이는 경우가 생길 수 있다.

 

 

 

결론은 커밋 시간을 정확히 몇초로 정해야 한다는 기준은 없지만, 해당 토픽과 토픽을 소비하는 모듈의 처리 속도를 계산하는 것이 가장 이상적이다.

 

'Kafka' 카테고리의 다른 글

Kafka Cluster 구성  (0) 2022.01.14
Kafka 기초개념 - 전체적인 개념  (0) 2021.07.08