선착순 구매 프로젝트

태그
백엔드
기술키워드
우수프로젝트

아키텍처

프로젝트 개요

해당 프로젝트는 마이크로서비스 아키텍처를 활용해 미리 상품을 담아두고 필요할 때 구매하는 기능을 제공합니다. 마이크로서비스 아키텍처를 통해 유연하고 확장 가능한 서비스 운영이 가능합니다.

구현 기능

Redis 싱글 스레드 특성을 활용한 상품 재고 관리 및 동시성 처리
데이터베이스 부하 감소 및 높은 성능 유지
Redis Replication을 통한 레디스 분산 처리
데이터 가용성과 내구성을 보장하고, 읽기 성능 향상, 마스터-슬레이브 구조를 통해 데이터 복제와 장애 조치(Failover) 지원
OpenFeign과 Resilience4j를 활용한 마이크로서비스 간 통신
신뢰성 있는 통신 및 장애 복원력 강화
Resilience4j를 통한 마이크로서비스 통신 안전성 향상
Circuit Breaker를 사용한 마이크로서비스 간 장애 전파 방지
Retry를 사용한 자동 재시도
Time Limiter를 사용한 무한 대기 방지
Api Gateway를 통한 라우팅 및 인가 기능 구현
클라이언트 요청을 적절한 마이크로서비스로 부하 분산
스케줄러를 통한 주문 및 배송 상태 관리
주문 및 배송 상태의 주기적인 업데이트
Spring Security, JWT를 사용한 인증/인가
무상태(stateless) 애플리케이션 설계
Google SMTP를 사용한 이메일 인증
신뢰성이 높고 쉽게 구현할 수 있는 Google SMTP 도입

성능 개선

비동기 통신을 통한 마이페이지 조회 성능 개선
동기 방식의 OpenFeign 호출을 Spring의 @Async와 CompletableFuture를 사용한 비동기 병렬 처리로 전환
TPS: 303.0 → 331.0 (약 9.24% 성능 개선)
Redis Cache 쓰기 전략별(+ Lua 스크립트) 상품 주문 성능 개선
캐시 쓰기 전략 변경: Write-Through → Write-Back
Lua 스크립트 적용: Redis의 원자성 활용한 분산락(Lock) 해제
TPS: 164.5 → 431.2 (약 162.2% 성능 개선)
트랜잭션 롤백 시, 의도치 않은 카프카 이벤트 발행 문제 해결
문제 상황
MSA 환경에서 트랜잭션과 이벤트 발행의 실행 시점 차이로 인해 데이터 일관성 유지 문제 발생
원인
트랜잭션이 성공적으로 커밋되기 전에 이벤트를 발행하는 로직이 포함되어 있어, 트랜잭션의 실패와 상관없이 이벤트가 발행될 수 있는 구조
해결 방법
@TransactionalEventListener를 도입하여 트랜잭션의 결과(커밋 또는 롤백)에 따라 조건적으로 이벤트를 발행하도록 변경
트랜잭션이 성공적으로 커밋된 후에만 이벤트를 발행하고, 트랜잭션이 롤백되는 경우 실패와 관련된 이벤트를 발행하도록 로직 수정