T
TechInsights
목록으로
BackEnd•2024. 07. 11.

Redis Stream 적용기

지마켓
지마켓 Engineering Team
Redis Stream 적용기

핵심요약

원문 보기

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은 분산 처리 환경에서 실시간 데이터 처리에 효율적인 도구입니다.
#BackEnd#BigData#Infra
지마켓
지마켓

지마켓 Engineering Team

기술 인사이트를 전달하는 공식 채널

You might also like

View all
토스 피플 : 새로운 길을 만들 땐 내 선택을 믿는다

토스 피플 : 새로운 길을 만들 땐 내 선택을 믿는다

"이 버튼 왜 안 눌려요?" 물류 현장의 목소리로 PDA 시스템 완성하기

"이 버튼 왜 안 눌려요?" 물류 현장의 목소리로 PDA 시스템 완성하기