- 실시간 공연 좌석 예매 서비스입니다. 분산 환경에서 확장성을 고려하여 구성 되어 대규모 트래픽과 동시성 문제에도 안정적인 서비스를 제공합니다.
대규모 트래픽 대응
- 대기열 시스템을 이용해 동시에 몰리는 대규모 트래픽을 안정적으로 처리
쿠폰 발급
- Redis를 통해 쿠폰 발급 시 동시성 문제 처리
- Kafka를 통해 쿠폰 발급 비동기 처리
좌석 선택
- Redis를 통해 좌석 선택 시 동서싱 문제 처리
결제 및 정산
- 결제 시 사용자에게 맞게 최적의 쿠폰을 사용해 결제 시스템 구축
- 정산 시스템을 이용해 판매자의 편의성 제공
박기도 | 박상훈 | 전민기 | 최용석 |
---|---|---|---|
@gido | @shoon95 | @awesominki | @choi-ys |
BE | BE | BE | BE |
공연 - 공연장 | 쿠폰 - CICD | 인증 - 인가 - 대기열 | 주문 - 결제 |
쿠폰 발급 및 적용
- Redis를 통해 Lock 없이 동시성 제어
- Kafka를 통한 비동기 쿠폰 발급
- 레지스트리 패턴을 통해 확장성을 고려한 쿠폰 도메인 설계
대기열
- webfulx를 이용한 비동기 대기열 처리
- kafka, redis를 이용해 트래픽 분산
- msa gateway 로드밸런서를 통한 트래픽 분산
- Spring scheduler를 이용한 대기열 처리
좌석 선점
- Redis를 활용한 좌석 선점
결제 및 정산
- Toss Payments sandbox 환경에서 webFulx를 이용한 비동기 기반 결제 승인
- 결제 승인 실패 시, 지수 Backoff와 Jitter를 이용한 비패턴화 기반 결제 재 시도
- Transaction Outbox Pattern과 Kafka Transaction을 이용한 트랜잭션 기반의 이벤트 처리
공연 / 공연장 관리
- DDD에 입각한 도메인 관리
- 좌석 조회나 삭제 등 필요한 부분에서 트레이드 오프를 고려한 설계
- 엘라스틱 스택을 이용한 로그 관리
CICD + 모니터링
- Github Action을 활용한 CICD 구축
- Docker 를 사용하여 Container 이미지 관리
- AWS Fargate 를 통하여 스프링 서비스 배포
- AWS EC2 를 통하여 Util 서버 배포(kafka, redis 등)
- AWS Lambda + AWS SNS + Slack API 연동하여 모니터링 시스템 구축
Redis(동시성) + Kafka(비동기 대용량 트래픽 처리)를 활용하여 문제 해결
kafka(트래픽 분산처리) + Redis(sorted set) 을 통한 대기열 순서 관리 및 실시간 순위 조회
리소스 최적화를 위해 Filbeat를 통한 로그 관리
Ip 기반 통신을 사용한 Eureka Client 관리
Transactional Outbox 패턴을 적용해 결제 테이블 갱신 트랜잭션 완료와 메시지 발행 간의 데이터 일관성 문제 해결
대기열 시스템을 적용하기 전과 후 비교시 응답 시간 기준 5배 성능 향상
N+1의 쿼리가 발생하는 상황에서 쿼리 성능 개선을 위해 영속성 컨텍스트를 거치지 않는 벌크 쿼리 도입
비동기 요청 시 HttpServletRequest 객체 활용 불가 문제를 ThreadLocal과 AOP를 통해 효과적으로 해결
Eureka Client의 등록 IP를 확인 후 직접 Container의 IP를 Eureka에 등록하여 Eureka가 정상적으로 Client의 IP를 호출할 수 있도록 구현