티스토리 뷰

CS

대규모 트래픽 처리 (2)

Greatshine 2023. 3. 7. 16:04

 

 

※ 혼자 공부를 하기 위해 정리한 글이며 참고 자료에 있는 글들을 인용했습니다.

 

 

쿠팡의 경우

 

2022년 쿠팡의 경우 2018년 대비 매출이 4배, 그에 따라 활성 사용자의 규모 역시 급성장했다.

1800만 명이 넘는 사용자들에게 새로운 서비스를 안정적으로 제공하기 위해 복잡한 데이터 네트워크 및

데이터 시스템을 개발하고 유지관리해야 했으며, 네트워크와 시스템의 복잡도 그리고 처리해야 할 데이터의 양은

빠른 속도로 증가했다고 한다.

 

해결책

= 자사의 이커머스 애플리케이션과 데이터베이스 사이에 코어 서빙 레이어 도입

→ 데이터베이스의 가용성을 높이면서 고객에게 데이터를 지연시간 없이 전달할 수 있게 됨.

 

 

마이크로서비스

 

쿠팡의 제품 상세 페이지를 확인해보면, 하나의 제품에는 여러 종류의 관련 데이터가 존재한다.

 

https://medium.com/coupang-engineering/%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%ED%8C%A1%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%A0%84%EB%9E%B5-184f7fdb1367

 

각 데이터는 유형별로 백엔드의 개별 마이크로서비스 아키텍처에서 관리된다고 한다.

EX) 제품 이미지 & 제목 데이터 = Catalog 마이크로서비스 / 도착 보장 배송일 = Stock & Fulfillment 마이크로서비스

각 데이터 포인트는 고객에 따라 개인화되며 실시간으로 변할 수 있는데,

예를 들어, 특정 물류센터가 일일 출고 한도에 도달하면 해당 물류센터로 더 이상 신규 고객 주문은 접수되지 않는다.

따라서 이러한 접수 마감에 의해 영향을 받게 되는 사용자는 관련 재고 및 보장 배송일 정보를 새롭게 업데이트받는다.

 

애플리케이션의 모든 페이지가 마이크로서비스에서 직접 데이터를 가져온다면

모든 마이크로서비스에 상시 고가용성이 확보되어야 한다.

또한 자주 사용하는 비즈니스 로직 코드는 각 프론트엔드 페이지에 중복 코드로 남게 된다.

→ 모든 페이지에서 공통으로 사용되는 데이터와 비즈니스 로직을 처리할 수 있는 단일 마이크로서비스가 필요해짐.

 

 

코어 서빙 레이어

 

비즈니스 로직 코드의 통합, 사용자 페이지에 대한 데이터 서빙을 위해 Materialization Platform팀은

코어 서빙 레이어를 개발했다.

 

데이터 서빙 플랫폼의 개략적 목표

● 장애 없이 상시 99%의 고가용성 및 사고 발생 시 최단 시간 내 빠른 복구 보장

● 고 처리량으로 데이터 서빙 및 지연시간 최소화로 대량의 데이터 읽기 트래픽 처리

● 여러 도메인에서 실시간으로 집계된 데이터의 일관성과 최신성 보장

● 프론트엔드의 복합도 및 코드 중복 감소를 위한 비즈니스 로직 코드 통합

 

 

아키텍처

https://medium.com/coupang-engineering/%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%ED%8C%A1%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%A0%84%EB%9E%B5-184f7fdb1367

 

사진은 단순화한 마이크로서비스 아키텍처와 코어 서빙 레이어라고 한다.

코어 서빙 레이어는 각 페이지에서 호출할 수 있는 마이크로서비스이다.

모든 페이지에 필요한 데이터 및 비즈니스 로직을 서빙하는 역할을 한다.

 

 

통합 NoSQL 데이터 스토리지

쿠팡에서는 백엔드의 개별 마이크로서비스가 제품 도메인 정보를 관리한다고 한다.

마이크로서비스 별로 데이터를 분리해 데이터 읽기 속도 및 처리량을 높인 것이다.

 

하지만 코어 서빙 레이어는 모든 마이크로서비스의 데이터 업데이트를 실시간으로 반영하지 않는다.

백엔드의 각 마이크로서비스가 업데이트된 데이터를 큐로 보내고, NoSQL DB인 공용 스토리지에 저장한다.

NoSQL DB는 데이터의 최종적인 일관성을 지원하고,

한 번의 읽기 작업으로 모든 마이크로서비스로 부터 데이터를 가져온다.

→ I/O를 상당히 줄이고 대규모의 데이터 처리를 지원할 수 있게 됨.

 

 

캐시 레이어

https://medium.com/coupang-engineering/%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%ED%8C%A1%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%A0%84%EB%9E%B5-184f7fdb1367

 

공용 스토리지는 영구 저장 공간이며 데이터 안정성을 제공한다.

여기서 대용량의 트래픽 처리와 지연시간 최소화를 강화하기 위해 read-through캐시 레이어를 추가했다고 한다.

이로 인해 10배 많은 처리량과 1/3로 줄어든 지연시간으로 데이터를 서빙할 수 있게 되었다.

 

하지만 공용 스토리지의 데이터 업데이트가 캐시 레이어에 상시 반영되지 않는다는 주의사항이 존재한다.

캐시 레이어가 사용자 페이지에 과거 데이터를 서빙할 수도 있다는 소리다.

EX) Catalog 마이크로서비스에서 제품 이미지를 변경하고 변경 사항을 공용 스토리지에 저장해도 해당 변경이

캐시 레이어에 즉각 반영되지 않음.

 

이러한 문제를 해결하기 위해 적용된 것이 캐시 무효화(cache invalidation) 로직이다.

공용 스토리지에 데이터 업데이트가 발생할 때마다 알림 큐로 데이터를 일종의 신호로써 전송한다.

알림 큐에서는 해당 신호를 바탕으로 캐시 레이어의 오래된 데이터를 최신 데이터로 교체한다.

→ 공용 스토리지의 데이터와 캐시 레이어의 데이터가 분 단위로 99.99% 동일하게 유지됨.

 

 

실시간 데이터 스트리밍

https://medium.com/coupang-engineering/%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%ED%8C%A1%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%A0%84%EB%9E%B5-184f7fdb1367

 

위에서 언급된 것처럼 read-through 캐시 레이어는 분 단위로 최신 데이터를 업데이트하는데,

일부 데이터는 초 단위로 처리될 필요가 있다. (재고 정보 등)

 

따라서 실시간 업데이트가 필요한 데이터를 고객에게 지연시간 없이 제공하기 위해

실시간 데이터 스트리밍 처리 방식을 도입했다.

큐에서 변경된 데이터를 읽고 별도의 실시간 캐시 레이어에 데이터 쓰기 작업을 즉각 실행하며

공용 서빙 레이어는 캐시 및 실시간 캐시 레이어를 동시에 읽고 양쪽 레이어에서 가장 최신 데이터를 서빙하도록

설계하여 지연시간 최소화를 추가적으로 지원하도록 했다고 한다.

이 두 번째 캐시 레이어는 대용량의 데이터 처리를 보장하며 사용자의 애플리케이션 페이지에 실시간 데이터를 서빙한다.

 

 

고가용성 전략

https://medium.com/coupang-engineering/%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%ED%8C%A1%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%A0%84%EB%9E%B5-184f7fdb1367

 

NoSQL 공용 스토리지 + 두 개의 캐시 레이어 = 대용량의 데이터 처리 및 지연 시간 최소화에 중점.

하지만 코어 서빙 레이어의 가장 중요한 기능은 "고가용성"이다.

고가용성 시스템으로 사용자 경험을 저해할 수 있는 모든 부분을 최소화해야 한다.

 

고가용성을 달성하기 위해 각 네트워크는 특정 I/O 지점에서 사고가 발생하더라도 그 영향이 종속되지 않도록

회로 차단기에서 래핑 된다. 그리고 사고가 발생한 구성 요소의 I/O를 수동으로 리디렉션 한다.

 

또 다른 주요 메커니즘으로는 핵심 서빙 경로(Critical Serving Path, CSP)가 있다.

쿠팡 이커머스 앱에는 많은 수의 사용자용 페이지가 존재하고 그중에는 사용자 경험에 중대한 영향을 미치는 페이지들이

존재한다. (홈, 검색, 주문 페이지와 같이 매출과 직결되는 페이지)

핵심 페이지의 고가용성을 위해 CSP 클러스터를 분리 구성하고,

그 외의 페이지는 비핵심 서빙 경로(NON CSP, N-CSP) 클러스터로 옮겼다고 한다.

 

두 개 클러스터는 서로 독립되어 있기 때문에 서로에게 영향을 주지는 않지만

CSP 클러스터에 사고가 발생하는 경우 새로운 배포 없이 동적으로 CSP에 속한 페이지 모두를 N-CSP 클러스터를

바라보게 해 사용자 경험에 부정적인 영향을 미치는 것을 막을 수 있다고 한다.

 

 

코어 서빙 레이어 템플릿

https://medium.com/coupang-engineering/%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%ED%8C%A1%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%A0%84%EB%9E%B5-184f7fdb1367

 

 

제품 도메인뿐만 아니라 오더 도메인, 이츠 도메인(쿠팡 이츠 정보 저장), 멤버 도메인이 존재하는데

이 도메인은 동일한 데이터 서빙 니즈가 있다.

 

다양한 도메인과 여러 애플리케이션 별로 코드베이스를 구축해 코어 서빙 레이어와 동일한 기능을 각 코드베이스가

제공하게 되면 곳곳에 중복된 코드가 생겨나고 관리가 어려워지게 된다.

 

→ 코어 서빙 레이어의 구현을 단순화, 핵심 비즈니스 로직을 공유하면서 동시에 각 도메인의 특수한 니즈에 맞춰

사용할 수 있도록 코어 서빙 템플릿을 생성.

사용자는 템플릿을 기반으로 공용 저장소, 캐시, 실시간 캐시 레이어 주소 등의 기본 구성 정보를 입력하기만 하면

해당 도메인을 위한 새로운 코어 서빙 레이어를 만들 수 있다고 합니다. 

 

 

참고 자료

 

대용량 트래픽 처리를 위한 쿠팡의 백엔드 전략
https://medium.com/coupang-engineering/%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%ED%8C%A1%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C-%EC%A0%84%EB%9E%B5-184f7fdb1367



캐시를 활용한 대용량 트래픽 처리 성능 향상 - 따로 읽어보시는 것을 추천합니다.
https://medium.com/coupang-engineering/%EC%BA%90%EC%8B%9C%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81-a274f4731d07

 

 

'CS' 카테고리의 다른 글

대규모 트래픽 처리 (1)  (0) 2023.03.01
index, B tree, B+ tree  (0) 2023.02.15
CPU-프로세스와 스레드  (0) 2023.02.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함