아키텍처
프로젝트 개요
해당 프로젝트는 마이크로서비스 아키텍처를 활용해 미리 상품을 담아두고 필요할 때 구매하는 기능을 제공합니다. 마이크로서비스 아키텍처를 통해 유연하고 확장 가능한 서비스 운영이 가능합니다.
구현 기능
•
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를 도입하여 트랜잭션의 결과(커밋 또는 롤백)에 따라 조건적으로 이벤트를 발행하도록 변경
▪
트랜잭션이 성공적으로 커밋된 후에만 이벤트를 발행하고, 트랜잭션이 롤백되는 경우 실패와 관련된 이벤트를 발행하도록 로직 수정