[Cloud] 올리브영 서버리스 랭킹 시스템
Cloud AWS Serverless
개요
- 출처: CJ 올리브영의 서버리스 랭킹 시스템 구축기
- 올리브영 온라인몰에는 수만여 개의 상품이 있고, 기존 시스템의 유연성과 확장성 부족으로 개선
개편 배경
- 기존 랭킹 시스템은 데이터베이스 자체 집계 활용
- 일부 카테고리 정보만 필터로 제공 -> 소비자들에게 다양한 탐색 기능을 제공하지 못함
- 문제점
- 낮은 확장성
- 랭킹 집계를 위한 연산 작업이 데이터베이스 자원에 종속되어, 다양한 집계 로직을 독립적으로 기획하는 것이 제한적
- 긴 수행 시간
- 정보 수집, 랭킹 집계를 모두 데이터베이스에서 처리하면서, 적은 수의 랭킹 집계에도 오랜 시간 소요
- 집계 데이터의 분석 활용 제한
- 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로 집계 작업을 빠르게 수행할 수 있음
- 단계
- 원하는 비즈니스 로직에 맞춰 Athena 집계 쿼리를 작성한 후, 저장된 쿼리(Saved Queries)로 등록
- 이후 Step Functions의 Parellel State를 활용해 여러 Branch로 연결
- 각 Branch는 개별 집계 로직을 나타내며, GetNamedQuery와 StartQueryExecution API를 순차 호출하도록 구현
- 저장된 쿼리 이름을 입력으로 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달러 미만의 매우 낮은 비용만 지불