Kafka Consumer Lag이 지속적으로 쌓이는 상황을 겪으면, 원인을 파티션 문제인지 애플리케이션 문제인지부터 구분해야 합니다.
확인 순서
1. 파티션 수 대비 컨슈머 인스턴스 수
컨슈머 그룹의 인스턴스 수가 파티션 수보다 적으면 일부 컨슈머가 여러 파티션을 처리하게 되어 병목이 생깁니다. @KafkaListener의 concurrency 옵션이 실제 파티션 수를 초과하지 않는지, 부족하지 않은지 먼저 확인했습니다.
2. 처리 로직 자체의 지연
컨슈머가 메시지를 가져오는 속도는 문제없는데, 비즈니스 로직(DB 저장, 외부 API 호출)이 느려서 처리량이 못 따라가는 경우가 많았습니다. 이 경우 max.poll.records를 줄이고 max.poll.interval.ms를 넉넉히 잡아 리밸런싱 폭풍을 방지했습니다.
3. 리밸런싱 빈도
처리 시간이 max.poll.interval.ms를 초과하면 컨슈머가 그룹에서 제외되고 리밸런싱이 발생합니다. 리밸런싱이 잦으면 그 자체로 처리량이 급격히 떨어지므로, 리밸런싱 로그를 모니터링 지표에 반드시 포함시켰습니다.
정리
Lag이 쌓인다고 무조건 파티션을 늘리는 것은 근본 해결이 아닐 수 있습니다. 병목이 I/O인지, 컨슈머 병렬도인지, 리밸런싱인지 구분한 다음 대응하는 순서가 중요합니다.