컬리, Kafka Streams와 Spring 통합으로 검색 인덱싱 파이프라인 안정성 확보
핵심 내용
컬리가 Kafka Streams와 Spring을 통합해 메시지 병합 로직을 단순화하고 스레드 사망 시 실시간 헬스체크가 가능한 구조로 전환했다.
자세히 보기
컬리 검색/추천 서비스 팀은 대규모 시스템 개편에 따라 서로 다른 토픽의 메시지를 하나의 데이터로 조합해 인덱싱하는 파이프라인을 재구축했다. 기존에는 Redis를 중간 저장소로 활용해 데이터를 적재하고 합치는 방식을 사용했으나, 더 효과적이고 단순한 대안으로 Kafka Streams 라이브러리를 도입했다.
Kafka Streams 적용 초기에는 Spring의 ApplicationStartedEvent를 통해 파이프라인을 실행했으나, 잘못된 규격의 메시지 처리 오류로 인해 Kafka Streams 스레드가 종료되는 문제가 발생했다. 이 경우에도 Spring Application 자체는 정상 상태로 유지되어 장애 감지가 어려웠다.
이를 해결하기 위해 Spring Kafka의 Kafka Streams 지원 기능을 활용하여 아키텍처를 변경했다. @EnableKafkaStreams 어노테이션을 적용해 Spring이 Kafka Streams 클라이언트의 생명주기를 직접 관리하도록 위임했으며, 개발자는 비즈니스 로직에만 집중할 수 있게 되었다.
또한 HealthIndicator를 구현하여 실시간 헬스체크 체계를 구축했다. Kafka Streams의 상태가 CREATED, RUNNING, RE-BALANCING일 때는 Health.up()을 반환하고, ERROR, NOT_RUNNING, PENDING_SHUTDOWN일 때는 Health.down()을 반환해 상세 정보를 제공한다. 이를 통해 스레드 사망 시 애플리케이션에 즉시 알릴 수 있는 안정성을 확보했다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.