Info

2024년 11월에 경험한 내용을 다루고 있습니다.

Kafka를 사용하는 서비스에서 메시지 중복 처리가 발생하여, 관련된 결과가 여러 번 적재되고 있는 것을 발견했습니다.
이 문제를 해결하기 위해 조사한 내용을 정리해 두려고 합니다.

문제 원인

  • 코드를 살펴본 결과, Kafka가 메시지를 가져오는 Polling 간격을 설정하는 max.poll.interval.ms 값이 기본값보다도 짧게 설정되어 있었고, 한 번에 불러오는 메시지의 양은 많았습니다.
  • 이 경우 처리 시간이 길어지면 설정한 값을 초과할 가능성이 높습니다.
  • 지금까지는 해당 조건에서도 메시지들을 잘 처리하고 있었지만, 순간적으로 트래픽이 몰리는 상황이 발생하면서 부하가 생겨 문제가 나타나게 되었습니다.
  • 이로 인해 Kafka broker는 해당 Consumer가 메시지 처리를 할 수 없다고 판단하여 Consumer 그룹에서 제외하는데 이를 리밸런싱(rebalancing) 이라고 합니다.
    리밸런싱이 발생하면 저장된 Offset부터 다시 처리를 시작하고, 이로 인해 중복 처리가 발생합니다.

해결 방법

  • max.poll.interval.ms 값을 증가시켜 모든 메시지 처리까지 기다리는 시간을 늘렸습니다.
    이러한 설정 변경과 배포 환경 안정화를 통해 리밸런싱 현상이 사라졌고, 중복 처리 문제가 해결되었습니다.
  • 참고로 Kafka의 기본 설정은 다음과 같습니다.
    • max.poll.interval.ms: 300000ms (5분)
    • max.poll.records: 500

참고 자료