[Cloud] 올리브영 서버리스 랭킹 시스템

[Cloud] 올리브영 서버리스 랭킹 시스템


Cloud AWS Serverless

개요

개편 배경

  • 기존 랭킹 시스템은 데이터베이스 자체 집계 활용
  • 일부 카테고리 정보만 필터로 제공 -> 소비자들에게 다양한 탐색 기능을 제공하지 못함
  • 문제점
    1. 낮은 확장성
      • 랭킹 집계를 위한 연산 작업이 데이터베이스 자원에 종속되어, 다양한 집계 로직을 독립적으로 기획하는 것이 제한적
    2. 긴 수행 시간
      • 정보 수집, 랭킹 집계를 모두 데이터베이스에서 처리하면서, 적은 수의 랭킹 집계에도 오랜 시간 소요
    3. 집계 데이터의 분석 활용 제한
      • DB에는 최신 랭킹 정보가 보관되지만 데이터를 시계열로 누적해 분석하는 2차 활용에 제한이 있음

신규 랭킹 시스템 아키텍처

  • Amazon EventBridge에서 정의한 이벤트 규칙에 따라 일정 주기로 시작
  • 서버리스 기반 수행

데이터 수집

  • 랭킹에 필요한 데이터베이스 데이터를 집계 영역으로 수집하기 위해 JDBC 연결 기반의 AWS Glue 작업 사용
  • 수집되는 데이터는 S3에 Parquet 파일 형식으로 저장
  • 이에 대한 스키마 정보를 Glue Catalog로 정의

집계 데이터 산출

  • Athena에서 S3 데이터 조회하여 랭킹 집계
  • 집계 결과는 지정된 S3 경로에 다시 저장

최종 데이터 전달

  • S3의 특정 경로에 Event Notifications를 생성해 집계 데이터가 산출되는 즉시 Lambda 서비스가 Amazon ElastiCache 영역에 전달하여 저장
  • 랭킹 데이터는 랭킹 조회 API를 이용해 다른 서비스에 전달됨

추가 고려사항

  • 설계 단계에서 Amazon Data Firehose 및 Amazon SQS 등 스트리밍 서비스를 사용해 실시간 주문 이벤트를 수집하고, 이를 랭킹에 즉각 반영하는 것을 고려
  • 주문 후 취소/반품/교환을 반복하는 비정상적 주문 활동이 랭킹에 반영되는 것을 방지하고자, AWS Glue를 활용하는 준 배치 방식의 수집을 선택
  • 비즈니스 요구사항 변화로 집계 로직이 변경되는 경우, 독립적으로 개발 및 배포할 수 있도록 Amazon Athena 쿼리를 집계 도구로 활용

랭킹 집계 파이프라인

  • 랭킹 집계는 Amazon EventBridge의 이벤트로 시작되어 각 데이터 로드 및 집계 작업 흐름은 작업 주기에 따라 여러 AWS Step Functions 작업 흐름으로 정의됨
  • 집계가 모두 완료되면 AWS Lambda에서 완성 데이터를 메모리 계층에 전달
  • 전체 과정이 병렬처리 가능한 방식으로 구현되어, 수백 개 랭킹 집계가 동시에 일어나도 수 분내 처리 가능

Amazon EventBridge

  • 완전 관리형 이벤트 버스 서비스
    • 다양한 애플리케이션, 마이크로서비스 및 SaaS 애플리케이션 간 이벤트를 생성, 전송 및 수집 가능
  • 특정 이벤트(이벤트 소스, 크론 표현식, 패턴 등)에 따라 트리거

AWS Glue

  • 완전 관리형 ETL (Extract, Transform, Load) 서비스
    • 데이터 추출, 변환, 로드하여 데이터 분석을 위한 준비 가능
    • 데이터 파이프라인을 구축하고 관리하는 데 필요한 모든 기능 제공

AWS Glue를 활용한 병렬 데이터 수집

  • Apache Spark 기반의 서버리스 ETL 엔진을 활용하므로, 작업 정의 단계에서 병렬 처리를 위한 고려가 필요
  • 신규 랭킹 시스템의 Glue ETL 작업은 DB로부터 증분 주문 데이터를 읽어오는데, ‘올영세일’ 기간처럼 단기간에 주문이 집중된다면 데이터 읽기 작업 시간에 지연 발생 가능
    • 병렬 처리를 활용해야 함
  • AWS Glue는 서버리스 엔진이기 때문에 주어진 병렬 유닛을 높은 효율로 사용하는 것이 비용 측면에서도 바람직

Amazon Athena

  • 대화형 쿼리 서비스
  • 표준 SQL을 사용해 S3에 저장된 데이터를 쉽게 분석
  • 서버리스 아키텍처

Amazon Athena 쿼리를 활용한 병렬 집계

  • Athena는 주로 대화형 분석에 활용되지만, DBeaver와 같은 클라이언트 도구에서 Athena 작업 그룹에 직접 연결해 개발하는 것도 가능
  • Glue Job으로 수집된 데이터를 컬럼 기반인 Parquet 파일로 저장하도록 했기 때문에, Athena로 집계 작업을 빠르게 수행할 수 있음

  • 단계
    1. 원하는 비즈니스 로직에 맞춰 Athena 집계 쿼리를 작성한 후, 저장된 쿼리(Saved Queries)로 등록
    2. 이후 Step Functions의 Parellel State를 활용해 여러 Branch로 연결
    3. 각 Branch는 개별 집계 로직을 나타내며, GetNamedQuery와 StartQueryExecution API를 순차 호출하도록 구현
    4. 저장된 쿼리 이름을 입력으로 GetNamedQuery API를 호출하면 쿼리 ID를 얻어낼 수 있고, 이 ID를 StartQueryExecution의 입력으로 전달하도록 Step Function의 입출력을 설정 가능
  • 위 그림에는 네 개의 Branch만 예시로 표현되지만, 올리브영 온라인몰에서는 랭킹 필터로 제공하는 수만큼의 Branch를 병렬로 연결
  • Athena의 저장된 쿼리 수가 많아지면, 작업 그룹 단위로 분리하여 운영 쿼리를 체계적으로 관리할 수 있음
  • 동시 실행되는 쿼리 수가 많다면 계정 당 GetNamedQuery API 호출에 대한 계정 당 할당량을 사전에 조정하는 것도 필요

Lambda를 활용한 최종 데이터 전달

  • Athena 쿼리 집계 결과는 ‘시간대’ 및 ‘집계 로직’에 따라 지정된 Amazon S3 경로에 저장됨
  • 랭킹 시스템에서는 집계의 후속 작업을 수행하기 위해 S3의 저장 경로에 Event Notifications를 생성하고 이벤트 기반으로 후속 작업을 수행하는 Lambda 함수를 정의함

랭킹 시스템의 운영 및 모니터링

  • 신규 랭킹 시스템은 파이프라인의 각 단계가 여러 서비스에 분리되어 있기 때문에, 성능과 기능 문제 발생 시 개별 서비스 로그에서 원인을 찾아낼 수 있음
  • ’올영세일’ 기간에 랭킹 집계가 지연된 적이 있었는데, 이 때에도 Glue 서비스의 수행 시간이 길어진 것을 확인하고 병렬화 수준을 조절해 해결
  • 다양한 이상 상태를 실시간으로 확인하고 즉각적으로 대응하기 위한 알림 기능 구현
    • Amazon SNS에 메시지 게시를 위한 Topic을 생성하고, 이에 대한 구독 엔드포인트로 Slack Webhook을 설정

적용 효과

  • 비즈니스 성과
    • 더욱 다양한 랭킹 집계 필터 제공
    • 페이지내 사용자 체류시간 및 구매 전환 비율 증가
  • 시스템 확장성
    • 여러 서비스 영역으로 랭킹 기능 확장
  • 데이터 기반 지속적 서비스 개선
    • 시간대별 랭킹 집계 결과를 S3에 파일로 적재하여, 이를 사후분석에 활용하기 용이
  • 합리적 비용
    • 서버리스 아키텍처로 다양한 랭킹 집계 워크로드를 짧은 주기마다 수행하면서도 전체 운영 파이프라인에 월 50달러 미만의 매우 낮은 비용만 지불
© 2024 Seungwon Bae 🇰🇷