핵심요약
Redis Stream을 활용하여 데이터 파이프라인의 세션 정보 데이터 처리 지연 문제를 해결하고, 대량 트래픽 상황에서도 안정적인 서비스 운영을 가능하게 한 경험에 대해 소개합니다.
Redis Stream을 활용한 대용량 세션 데이터 처리 개선
Redis Stream 도입 배경
montelena receiver를 통해 수집된 User 행동 정보(view, event, impression 등)는post Processor를 거쳐 지표 트래킹 및 분석에 활용됩니다.session_id를 통한 유니크 활성 사용자 식별 및 히스토리 저장이 주요 기능입니다.- **Big Smile Day (BDS)**나 User Targeting Content (UTC) Push 발송 시 급증하는 트래픽으로 인해 데이터 처리 지연이 발생했습니다.
- 기존 Redis 사용 환경을 유지하면서 kafka나 MQ 도입의 추가 개발 공수 및 리소스 소모 없이, 빠르게 히스토리 적재 로직을 분리하기 위해 Redis Stream을 선택했습니다.
Redis Stream의 특징 및 Redis Pub/Sub과의 비교
- Redis 5.0 버전에서 도입된 Redis Stream은 고가용성 데이터 스트리밍 처리를 지원하며, in-memory 기반으로 빠른 속도를 제공합니다.
- Redis Pub/Sub은 메시지 휘발성 및 다중 Subscriber 시 데이터 중복 문제가 있습니다.
- Redis Stream은
Kafka의 offset 개념과 유사하게 마지막 수신 record id를 저장하여 메시지 유실 없이 처리합니다. - XADD, XREADGROUP, XACK, XPENDING, XCLAIM 등 다양한 명령어를 통해 메시지 제어가 가능합니다.
- Consumer Group을 지원하여 여러 Consumer가 중복 없이 순차적으로 병렬 처리할 수 있습니다.
XACK명령어로 메시지 처리 여부를 확인하고,Pending Entries List를 통해 미처리 메시지를 재처리할 수 있습니다.
Redis Stream 개발 구현
- Publisher:
Post Processor에서 가공된 세션 객체를ObjectRecord<String, String>형태로 캡슐화하여gmktRedisTemplate.opsForStream().add(record)메서드를 통해 Redis Stream 메시지로 발행합니다. recordId는 Redis가 생성하는 고유 ID입니다.MapRecord형태도 지원합니다.- Consumer:
spring-boot-starter-data-redis의존성 추가 후StreamListener인터페이스를 구현합니다. afterPropertiesSet()메서드에서createStreamConsumerGroup()을 호출하여 StreamKey와 Consumer Group을 설정하고StreamMessageListenerContainer를 초기화합니다.listenerContainer.receive()를 통해 메시지 구독을 설정하고,onMessage()메서드에서 메시지 처리 로직을 구현합니다.- 메시지 처리 후
redisTemplate.opsForStream().acknowledge(streamKey, consumerGroupName, recordId)를 호출하여 ACK를 전송하고 메시지를 대기열에서 제거합니다.
Redis Stream 적용 시 고려사항
- 파티션 개념 부재: Redis Cluster 환경에서 sharding된 노드에 메시지를 고르게 분배하려면 N개의 Stream을 추가적으로 할당하는 개발이 필요하며, 이로 인해 메시지 produce 순서 보장이 어려워집니다.
- Memory 관리: in-memory 기반이므로
XACK되지 않은 pending 메시지가 쌓여 Redis Cluster의 메모리 Full 이슈를 유발할 수 있습니다. - 문제 해결: 1분마다 스케줄러를 통해
pendingSummary를 확인하고,pendingMessages를read하여 미처리 메시지를 재처리하고acknowledge하는 로직을 구현하여 메모리 이슈를 방지해야 합니다.
결론
- Redis Stream 적용을 통해 UTS Push 발송 시 지연되던 트래픽 처리 문제를 해결하고, BDS 행사 기간에도 안정적인 서비스를 제공할 수 있었습니다.
- Redis Stream은 분산 처리 환경에서 실시간 데이터 처리에 효율적인 도구입니다.