All Articles

Kafka - (7) Offset Commit

자동 커밋(Auto commit)

  • 컨슈머 오프셋 관리를 사용자가 직접할 필요 없는 경우 자동으로 커밋을 해주는 설정이다.
  • 로그성 데이터 등, 비교적 컨슘 후의 비즈니스 로직이 복잡하지 않은 경우에는 쓰기에 좋다.
  • enable.auto.commit=true 옵션으로 auto commit을 활성화 한다.
  • auto.commit.interval.ms 옵션으로 오토커밋의 주기를 설정한다.(* poll 주기와 동일한 건 아니다.)
  • 오토커밋은 데이터 중복이나 유실을 유발할 수 있으니 주의한다.

  • 데이터 처리가 끝날 때 commit을 하는 수동 커밋과 달리, 폴링 주기에 맞춰 커밋할 시간이 되었는지 확인하여 시간이 되었으면 커밋을 수행한다. 즉, 작업 단위가 아니라 시간 단위로 커밋이 되는 게 특징이다.

수동 커밋

  • 메시지 처리가 완전히 완료되기 전까지 메시지를 가져온 것으로 간주하면 안되는 경우 사용한다.
  • 물론 메시지(데이터) 처리 과정의 비즈니스 로직이 길고 복잡한 경우, 그 처리 로직에서 실패가 발생했을 때 retry 과정에서 중복처리가 발생할 수는 있다. 이 경우 이 offset은 영원히 commit되지 못하기 때문에 다음 메시지를 가져오지 못하고 막히는 문제가 생긴다.

  • 즉, 자동 커밋이든 수동 커밋이든 컨슈머는 동일 메시지를 수신할 가능성도 있고 retry가 있을 수 있으므로 멱등성을 고려하는 것이 좋다.

(1) 동기 커밋

  • 명시적으로 오프셋을 커밋하는 방법 중 하나로, 동기 커밋은 브로커에 커밋 요청을 하고 커밋이 정상적으로 처리되었는지 응답을 기다린다.
  • 데이터 처리에 실패하면 Exception을 던진다.

(2) 비동기 커밋

  • 명시적으로 오프셋을 커밋하는 방법 중 하나로, 비동기 커밋은 동기 커밋과 다르게, 브로커에 커밋 요청 후 기다리지 않고 다른 데이터 처리를 수행한다.
  • 코드 자체에서 바로 실패 여부를 알 수 없고, 콜백을 받아야 데이터 처리 실패 여부를 알 수 있다.

[참고자료]
고승범 외(2018), 카프카: 데이터 플랫폼의 최강자, 책만.
https://jyeonth.tistory.com/30


이전 글

(6) Offset과 Consumer Group, 그리고 Lag

다음 글

(8) 응용 기술