대용량 트래픽 처리를 위한 쿠팡의 백엔드 전략

마이크로서비스로 고객에게 데이터 서빙하기: 고가용성, 고처리량, 그리고 지연시간 최소화 — Part 1

쿠팡 엔지니어링
Coupang Engineering Blog
11 min readSep 2, 2022

--

By Gogi (Du Hyeong) Kim, Key (Ki Hyeon) Kim

본 포스트는 영문으로도 제공됩니다.

2018년 대비 현재 쿠팡의 매출은 4배로 늘었고 활성 사용자의 규모 역시 급성장했습니다. 쿠팡은 그동안 고객에게 “WOW”한 경험을 제공하자는 앞으로도 영원히 지켜질 사명 하에 로켓배송, 로켓프레시와 같은 신규 서비스를 론칭해 왔습니다. 이 서비스들로 쿠팡은 고객들에게 경쟁사 대비 차별화된 가치와 혜택을 제공할 수 있게 되었습니다. 하지만 1800만명이 넘는 고객에게 새로운 서비스를 안정적으로 제공하기 위해서는 복잡한 데이터 네트워크 및 데이터 시스템을 개발하고 유지관리해야 했으며, 네트워크와 시스템의 복잡도와 처리해야 할 데이터의 양은 빠른 속도로 증가했습니다.

이를 해결하기 위해 저희는 자사의 이커머스 애플리케이션과 데이터베이스 사이에 코어 서빙 레이어를 도입했고, 데이터베이스의 가용성을 높이면서 고객에게 데이터를 지연시간(latency) 없이 전달할 수 있게 되었습니다. 이번 포스트를 통해 코어 서빙 레이어가 저희의 백엔드 전략에서 어떻게 활용되고 있는지를 공유드리려고 합니다. 코어 서빙 레이어를 운영하면서 마주했던 기술적 과제들과 그 해결책에 대한 내용은 해당 시리즈의 Part 2에서 확인하실 수 있습니다.

목차

· 배경 및 과제
· 코어 서빙 레이어
· 아키텍처
· 통합 NoSQL 데이터 스토리지​
· 캐시 레이어
· 실시간 데이터 스트리밍
· 고가용성 전략
· 코어 서빙 레이어 템플릿
· 마무리

배경 및 과제

쿠팡 이커머스 애플리케이션의 제품 상세 페이지 내 제품 도메인 관련 마이크로서비스들
그림 1. 제품의 데이터는 여러 마이크로서비스에서 제공됩니다. 이미지와 브랜드명은 편집했습니다.

쿠팡은 마켓플레이스이기도 하지만, 도매로 상품을 매입해 자사 배달 서비스인 로켓배송으로 고객에게 직접 상품을 판매하기도 합니다. 단순한 개념이지만, 이러한 서비스를 가능케 하는 비즈니스와 데이터 로직은 일반 이커머스 플랫폼보다 훨씬 복잡합니다.

그림 1은 쿠팡 이커머스 애플리케이션의 제품 상세 페이지입니다. 페이지 내 각각 다른 색깔로 표시되어 있듯이, 하나의 제품에는 여러 종류의 관련 데이터가 존재합니다. 각 데이터는 유형별로 백엔드의 개별 마이크로서비스 아키텍처에서 관리됩니다. 예를 들면, 제품 이미지와 제목 데이터는 Catalog 마이크로서비스에서 관리되고, 도착 보장 배송일은 Stock & Fulfillment 마이크로서비스에서 관리됩니다.

또한, 각 데이터 포인트는 고객에 따라 개인화되며 실시간으로 변합니다. 예를 들어, 특정 물류센터(FC)가 일일 출고 한도에 도달하면 해당 FC로 더 이상 신규 고객 주문은 접수되지 않습니다. 이때 접수마감에 의해 영향을 받게 되는 고객은 관련 재고 및 보장 배송일 정보를 새롭게 업데이트받아야 합니다.

애플리케이션의 모든 페이지가 마이크로서비스에서 직접 데이터를 가져온다면 모든 마이크로서비스에 상시 고가용성이 확보되어야 합니다. 그리고 자주 사용하는 비즈니스 로직 코드는 각 프런트엔드 페이지에 중복 코드로 남습니다. 이런 이유로 모든 페이지에서 공통으로 사용되는 데이터와 비즈니스 로직을 처리할 수 있는 단일 마이크로서비스가 필요해졌습니다.

코어 서빙 레이어

앞서 설명된 복합적인 데이터 요구사항 및 각종 과제의 해결을 위해, Materialization Platform 팀은 코어 서빙 레이어를 개발했습니다. 코어 서빙 레이어의 주목적은 2개입니다: 비즈니스 로직 코드의 통합, 그리고 고객 페이지에 대한 데이터 서빙.

데이터 서빙 플랫폼의 개략적인 목표는 다음과 같습니다.

  • 장애 없이 상시 99.99%의 고가용성 및 사고 발생 시 최단 시간 내 빠른 복구 보장
  • 고처리량으로 데이터 서빙 및 지연시간 최소화로 대량의 데이터 읽기 트래픽 처리
  • 여러 도메인에서 실시간으로 집계된 데이터의 일관성과 최신성 보장
  • 프런트엔드의 복합도 및 코드 중복 감소를 위한 비즈니스 로직 코드 통합

아키텍처

단순화한 쿠팡의 마이크로서비스 아키텍처와 코어 서빙 레이어
그림 2. 단순화한 마이크로서비스 아키텍처와 코어 서빙 레이어

그림 2에서 볼 수 있듯이 코어 서빙 레이어는 각 페이지에서 호출할 수 있는 마이크로서비스입니다. 코어 서빙 레이어는 모든 페이지에 필요한 데이터 및 비즈니스 로직을 서빙합니다. 다음 섹션에서는 코어 서빙 레이어의 기능 및 구성요소, 그리고 이들 요소가 어떻게 작동해 고가용성(High Availability), 고처리량(High Throughput), 그리고 지연시간 최소화(Low Latency)의 데이터 서빙을 가능케 하는지 설명드리겠습니다.

통합 NoSQL 데이터 스토리지​

쿠팡에서는 백엔드의 개별 마이크로서비스가 제품 도메인 정보를 관리합니다. 그림 1과 같이 제품의 이미지와 이름은 Catalog 팀에서, 가격은 Pricing 팀에서, 재고 정보는 Fulfillment 팀에서 제공합니다. 쿠팡은 마이크로서비스 별로 데이터를 분리해 데이터 읽기 속도 및 처리량을 높였습니다.

단, 코어 서빙 레이어는 모든 마이크로서비스의 모든 데이터 업데이트를 실시간으로 반영하지는 않습니다. 대신 백엔드의 각 마이크로서비스가 업데이트된 데이터를 큐로 보내고 NoSQL DB인 공용 스토리지에 저장합니다. NoSQL DB는 데이터의 최종적인 일관성을 지원하고, 한번의 읽기 작업으로 모든 마이크로서비스로부터 데이터를 가져옵니다. 저희는 이런 방식으로 작동하는 스토리지를 코어 서빙 레이어에 통합해 I/O를 상당히 줄이고 대규모의 데이터 처리를 지원할 수 있게 되었습니다.

캐시 레이어

쿠팡 백엔드의 공용 스토리지 및 캐시 레이어
그림 3. 공용 스토리지에 캐시 레이어를 추가하여 처리량을 더 늘리고 지연시간 또한 더 최소화했습니다.

공용 스토리지는 영구 저장 공간이며 데이터 안정성을 제공합니다. 대용량의 트래픽 처리와 지연시간 최소화를 강화하기 위해 read-through 캐시 레이어를 추가했습니다. 고성능 캐시 레이어 덕분에 공용 스토리지만을 사용하는 경우에 비해 10배 많은 처리량과 1/3로 줄어든 지연시간으로 데이터를 서빙할 수 있게 되었습니다.

그러나 캐시와 관련해서는 주의할 사항이 하나 있습니다. 공용 스토리지의 데이터 업데이트가 캐시 레이어에 상시 반영되지 않는다는 점입니다. 그 결과, 캐시 레이어가 고객 페이지에 과거 데이터를 서빙하는 경우가 발생할 수도 있습니다. 예를 들어, Catalog 마이크로서비스에서 제품 이미지를 변경하고 변경 사항을 공용 스토리지에 저장하더라도, 해당 변경이 캐시 레이어에 즉각 반영되지 않는 것입니다.

이 문제의 해결을 위해 적용한 것이 캐시 무효화(cache invalidation) 로직입니다. 공용 스토리지에 데이터 업데이트가 발생할 때마다 알림 큐로 데이터를 일종의 신호로 전송합니다. 알림 큐에서는 해당 신호를 바탕으로 캐시 레이어의 오래된 데이터를 최신 데이터로 교체합니다. 이러한 메커니즘을 통해 공용 스토리지의 데이터와 캐시 레이어의 데이터가 분 단위로 99.99% 동일하게 유지됩니다.

실시간 데이터 스트리밍

Read-through 캐시 레이어는 분 단위로 최신 데이터를 업데이트합니다. 하지만 일부 데이터는 초 단위로 처리될 필요가 있습니다. 재고 정보가 그렇습니다. 품절 제품에 대한 정보가 고객에게 즉시 업데이트되지 않은 상황에서 고객이 제품을 구매하게 되면, 원했던 제품이 아니어서 구매 완료 이후 고객은 품절 안내와 환불을 받게 됩니다. 이런 경우 고객 경험에 큰 오점을 남기고 쿠팡에 대한 전반적인 신뢰 역시 약화시킬 수 있습니다.

쿠팡 코어 서빙 레이어의 실시간 캐시 레이어
그림4. 코어 서빙 레이어의 실시간 캐시 레이어

이에 실시간 업데이트가 필요한 데이터를 고객에게 지연시간 없이 제공하기 위해 쿠팡은 실시간 데이터 스트리밍 처리 방식을 도입했습니다. 실시간 데이터 업데이트 스트리밍은 큐에서 변경된 데이터를 읽고 별도의 실시간 캐시 레이어에 데이터 쓰기 작업을 즉각 실행합니다. 공용 서빙 레이어는 캐시 및 실시간 캐시 레이어를 동시에 읽고, 양쪽 레이어에서 가장 최신 데이터를 서빙하도록 설계되어 지연시간 최소화를 추가적으로 지원합니다. 이 두 번째 실시간 캐시 레이어는 대용량의 데이터 처리를 보장하면서 고객의 애플리케이션 페이지에 실시간 데이터를 서빙합니다.

고가용성 전략

NoSQL 공용 스토리지와 두 개의 캐시 레이어는 대용량의 데이처 처리와 지연시간 최소화에 초점을 맞춥니다. 하지만, 코어 서빙 레이어의 가장 중요한 기능은 고가용성입니다. 고가용성 시스템으로 고객 경험을 저해할 수 있는 모든 사건 사고를 최소화해야 합니다.

고가용성을 달성하기 위해, 각 네트워크는 특정 I/O 지점에서 사고가 발생하더라도 그 영향이 케스케이드(cascade) 되지 않도록 회로 차단기로 래핑됩니다. 그리고 사고가 발생한 구성 요소의 I/O를 수동으로 리디렉션합니다.

가용성을 위해 적용한 또 다른 주요 메커니즘에는 핵심 서빙 경로(Critical Serving Path, CSP)가 있습니다. 쿠팡 이커머스 앱에는 많은 수의 고객용 페이지가 존재합니다. 그리고 그 중 고객 경험에 중대한 영향을 미치는 페이지들이 있습니다. 바로 홈, 검색, 주문 페이지 같이 매출과 직결되는 페이지입니다. 이런 페이지 중 하나라도 정상적으로 작동하지 않게 되면 고객 경험은 크게 나빠지게 됩니다.

핵심 페이지의 고가용성을 위해 CSP 클러스터를 분리 구성하고, 그 외의 페이지는 비핵심 서빙 경로(Non CSP, N-CSP) 클러스터로 옮겼습니다. 두 개 클러스터는 서로 독립되어 있기 때문에 N-CSP 클러스터의 사고는 CSP 클러스터에 영향을 주지 않습니다. 반면, CSP 클러스터에 사고가 발생하는 경우 새로운 배포 없이 동적으로 CSP에 속한 페이지 모두를 N-CSP 클러스터를 바라보게 해 고객 경험에 부정적인 영향을 미치는 것을 막을 수 있습니다.

쿠팡 백엔드 내 고가용성의 CSP와 NCSP 클러스터
그림 5. CSP와 N-CSP 클러스터는 고가용성을 지원합니다.

코어 서빙 레이어 템플릿

코어 서빙 레이어의 작동 방식과 제품 도메인의 마이크로서비스들이 고객 페이지에 데이터를 서빙하는 방법을 알아보았습니다.

앞서 언급되었던 제품 도메인 뿐만 아니라 고객 주문정보를 제공하는 오더 도메인, 쿠팡 이츠 정보를 저장하는 이츠 도메인, 고객 정보를 제공하는 멤버 도메인이 있습니다. 이 도메인 모두 동일한 데이터 서빙 니즈가 있습니다.

이런 다양한 도메인과 여러 애플리케이션 별로 코드베이스를 구축해 코어 서빙 레이어와 동일한 기능을 각 코드베이스가 제공하게 되면 곳곳에 중복된 코드가 생겨나게 되고 관리는 어려워집니다. 그래서 코어 서빙 레이어를 여러 도메인에 적용할 수 있도록 표준화할 필요가 있었습니다.

그래서 코어 서빙 레이어의 구현을 단순화하고 핵심 비즈니스 로직을 공유하면서 동시에 각 도메인의 특수한 니즈에 맞춰 사용할 수 있는 코어 서빙 템플릿을 만들었습니다. 사용자는 템플릿을 기반으로 공용 저장소, 캐시, 실시간 캐시 레이어 주소 등의 기본 구성 정보를 입력하기만 하면 해당 도메인을 위한 새로운 코어 서빙 레이어를 만들 수 있습니다.

코어 서빙 템플릿을 활용하는 쿠팡 & 쿠팡이츠 애플리케이션 도메인들의 각종 인스턴스
그림 6. 코어 서빙 템플릿을 활용하는 여러 쿠팡 & 쿠팡이츠 애플리케이션 도메인의 각종 인스턴스

마무리

여러 마이크로서비스 시스템의 데이터를 쿠팡 애플리케이션 페이지에 제공하기 위한 통합적이고 체계적인 접근 방식이자 해결책으로 저희는 코어 서빙 레이어를 도입했고, 데이터 서빙에 있어 고가용성, 고처리량 및 지연시간 최소화를 달성할 수 있었습니다. 저희는 또한, 여러 도메인에 걸쳐 재사용성 및 표준화를 보장하기 위해 데이터 서빙 기반과 통합 비즈니스 로직을 제공하는 코어 서빙 레이어 템플릿을 배포했습니다.

이번 포스트는 “대용량 트래픽 처리를 위한 쿠팡의 백엔드 전략” 시리즈의 첫 번째 이야기입니다. Part 2에서는 코어 서빙 레이어를 운영하며 마주하고 해결했던 몇 가지 기술 및 운영 과제들을 소개하도록 하겠습니다.

복잡한 마이크로서비스 아키텍처 관련 업무에 매력을 느끼신다면 쿠팡의 채용 공고를 살펴보시고 커리어 성장을 위해 로켓에 올라타보세요!

--

--

쿠팡 엔지니어링
Coupang Engineering Blog

쿠팡의 엔지니어들은 매일 쿠팡 이커머스, 이츠, 플레이 서비스를 만들고 발전시켜 나갑니다. 그 과정과 결과를 이곳에 기록하고 공유합니다.