컬리, Spring Kafka ConsumerSeekAware 활용 무중단 오프셋 이동 구조 도입
핵심 내용
컬리 주문플랫폼개발 팀이 Spring Kafka의 ConsumerSeekAware와 Redis Pub/Sub을 결합해 컨슈머 그룹 중단 없이 오프셋을 이동하는 방식을 적용했다.
자세히 보기
컬리 주문플랫폼개발 팀은 분산 시스템 환경에서 Spring Kafka를 활용해 컨슈머 그룹의 중단 없이 오프셋을 이동하고 메시지를 재처리하는 방식을 도입했다. 기존에는 카프카 CLI나 alterConsumerGroupOffsets API를 사용했으나, 이 방법들은 컨슈머 그룹이 inactive(비활성) 상태여야만 작동하여 애플리케이션 중단을 유발했다. 이는 실시간 배달을 보장하는 '컬리나우' 서비스의 가용성을 저하시키는 주요 원인이었다.
새로운 방식은 ConsumerSeekCallback과 AbstractConsumerSeekAware를 활용한다. Spring Kafka는 Consumer#seek API를 내부적으로 지원하며, 이를 통해 특정 파티션의 오프셋을 동적으로 변경할 수 있다. 애플리케이션은 Redis Pub/Sub을 통해 오프셋 이동 요청을 수신하고, 각 컨슈머 인스턴스는 할당된 파티션에 대해 seekToBeginning 또는 seek 메서드를 호출하여 처리 위치를 조정한다. 이 과정은 컨슈머 그룹의 재밸런싱이나 애플리케이션 재시작 없이 수행된다.
구현 시 Spring Kafka 3.3.0 이상 버전에서는 getTopicsAndCallbacks() 메서드를 사용하여 콜백을 안전하게 관리한다. 이전 버전에서 발생하던 콜백 누락 문제를 해결하고, 여러 컨슈머 그룹이 동일한 토픽을 구독할 때의 충돌을 방지한다. 이 구조는 권한 없이도 개발자가 독립적으로 오프셋을 제어할 수 있게 하며, 메시지 Lag 처리 지연을 최소화하여 실시간 데이터 처리의 안정성을 확보한다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.