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