- 프로젝트의 주요 내용은 대용량 트래픽 처리, 동시성 제어 입니다.
- 사용자에게 최적화된 쇼핑 경험을 제공하는 이커머스 플랫폼입니다.
2024.06 ~ 2024.07 (4주)
- 사용자 관리
- 유저 관리
- 회원가입
- 로그인
- 로그아웃
- 위시리스트 관리
- 위시리스트 CRUD
- 유저 관리
- 상품 관리
- 상품 CRUD
- 재고 조회
- 주문 관리
- 주문 처리
- 주문하기
- 장바구니 관리
- 장바구니 CRUD
- 주문 처리
- 주문 내역
- 주문 정보 조회
- 주문 취소 및 반품
문제점
- 초기 이메일 인증 구현에서는 이메일 인증 코드를 저장하고 확인할 메커니즘이 필요했음.
해결 방법
- Redis는 이메일 인증 코드와 같은 단기적이고 중요하지 않은 데이터를 저장하기에 적합하여 선택.
- Redis는 TTL을 설정하여 설정된 시간이 지나면 자동으로 인증 코드를 만료시켜 이 사용 사례에 이상적.
주요 사항
- 이메일 인증 코드를 저장하고 관리하기 위해 Redis를 사용.
- 코드가 자동으로 만료되어 시스템에 불필요한 데이터가 남아있지 않으며 사용자에게 서비스 제공 가능
아키텍처:
- Redis가 인증 코드의 저장을 처리.
- 사용자가 제출한 인증 코드는 Redis와 대조하여 확인.
문제점:
- 서비스가 커졌을 때를 대비해 모놀리식 아키텍쳐에서 마이크로서비스 아키텍쳐로의 변환이 필요.
해결 방법:
- 마이크로서비스 아키텍처를 구현하기 위해 Spring Cloud의 Eureka를 사용.
주요 변경 사항:
- Eureka를 서비스 디스커버리 서버로 설정하여 각 마이크로 서비스를 Eureka 서버에 등록.
- API Gateway를 사용하여 클라이언트 트래픽을 관리하고, 각 서비스로 라우팅.
- 서비스 간 통신은 Spring Cloud의 Feign Client를 사용하여 서비스 위치를 쉽게 찾고 호출.
- Spring Cloud LoadBalancer를 사용하여 서비스 간 통신 시 로드 밸런싱을 자동으로 처리.
아키텍처:
- Eureka 서버를 통해 마이크로서비스를 등록하고, API Gateway와 Feign Client를 통해 서비스 간 통신을 관리.
문제점
- 부하 테스트를 진행하는 도중 동시성 문제로 인해 서비스 간의 요청이 동시에 들어올 때 DB 정합성이 맞지 않는 현상 발생.
해결책
- RabbitMQ를 도입하여 메시지 큐를 사용한 비동기 통신을 구현.
- 이벤트 기반 아키텍처(EDA)를 적용하여 서비스 간의 의존성을 줄이고 실시간으로 이벤트를 처리.
주요 변경 사항
- RabbitMQ는 메시지의 영구 저장과 재전송을 지원하여 메시지 손실을 방지.
- 메시지 큐를 통해 서비스 간의 동시성 문제를 해결하고, 이벤트 기반 아키텍처를 구현.
아키텍처:
- RabbitMQ를 통해 비동기 통신을 구현하고, EDA를 적용하여 이벤트를 실시간으로 처리.
1-1. RabbitMQ
-
달성하고자 했던 목표
- 동시에 여러 주문이 들어왔을 때 발생한 Race Condition에 의한 재고 불일치 문제 해결
-
실제 개선 사례
-
RabbitMQ 적용 후 작업이 안정적으로 큐에 쌓이고, 지정된 순서대로 처리됨 확인
-
도입 전 3000개 주문 중 1200~1300개의 재고는 빠지지 않는 현상 발생
→ 도입 후 재고 모두 정상처리
-
15만건의 대규모 데이터처리에도 재고 정상 처리 확인
-
2-1. 로컬 캐시
-
달성하고자 했던 목표
- 동시성 제어 후 주문 시간이 오래 걸리는 문제 발생 → 시간 단축 필요
-
실제 개선 사례
-
Order Service에서 Product Service로 가격 요청하여 서버 메모리에 저장
-
주문 처리시간 대폭 개선 및 통신 비용 절약
-
2-2. 스케일 아웃 및 로드밸런싱
-
달성하고자 했던 목표
- 안정적인 서비스 운영을 유지하기 위해 고객 주문의 급증으로 인한 하나의 서비스에 대한 시스템 과부하 방지
-
실제 개선 사례
- Order-Service 와 Product-Service 수를 3배 늘린 후 트래픽 분산 → 부하 분산 및 속도 개선
