ksqlDB 실시간 Join으로 뉴스 추천 만들기
강병수 토스 · 토스 기술 블로그
AI 핵심 요약
토스증권은 MAB 뉴스 추천의 CTR을 갱신하려면 뉴스 노출·클릭 로그에 유저 클러스터 정보를 실시간으로 붙여야 했지만, 로그마다 MongoDB를 조회하면 초당 수만 건의 요청이 발생할 수 있었습니다. 이를 해결하기 위해 Debezium CDC로 MongoDB의 클러스터 데이터를 Kafka에 전달해 KTable로 만들고, 뉴스 활동 로그 KStream과 LEFT JOIN해 클러스터 번호가 포함된 결과를 생성했습니다. Join이 정확히 동작하도록 두 토픽의 파티션 수와 키를 맞추고, KStream에는 PARTITION BY, KTable에는 GROUP BY를 적용했습니다. 이 사례는 ksqlDB의 상태 저장과 실시간 Join을 활용하면 원본 서비스 데이터베이스의 부하를 피하면서 추천 시스템에 필요한 데이터를 빠르게 조합할 수 있음을 보여줍니다.
- ksqlDB의 KTable은 Kafka 토픽을 소비해 만든 로컬 상태 저장소이므로, 서비스 데이터베이스에 매 로그마다 조회를 보내지 않고도 실시간 Join에 활용할 수 있습니다.
- MongoDB 데이터를 KTable로 사용하려면 Debezium CDC로 초기 스냅샷과 변경 사항을 Kafka 토픽에 전달해야 합니다.
- Join 대상 토픽은 파티션 수를 맞추고, 같은 Join 키로 파티셔닝해야 누락 없이 결과를 얻을 수 있습니다.
- KStream은 PARTITION BY, KTable은 GROUP BY로 키를 재파티셔닝할 수 있으며, KTable의 키별 최신 값은 LATEST_BY_OFFSET으로 유지할 수 있습니다.
소개
오늘은 ksqlDB의 강력한 Join 기능을 활용해서 토스증권의 다양한 로그를 실시간으로 조합하여 중요한 비즈니스 문제를 해결한 사례를 소개하려고 합니다.