📕

Payment

계정의 잔액과 포인트에 대한 동시성 handling 필요
계정 잔액 및 포인트 사용 검증 → 분산락 적용
IF. 분산락 적용(redis) 어려움 → 적절한 DB(transaction) row 잡아 pessimistic lock 적용
단, transaction 크기 줄여서 가져갈 것
첫 요청에서 PENDING/SUCCESS → 다시 결제 요청 X ⇒ validation 필요
계정 잔액, 포인트 사용, 트랜잭션 상태 검증
트랜잭션 상태 업데이트하는 주체 명확한 표현 필요 ⇒ 주체 명확하게 나뉜 후 결과 응답하는 방식
트랜잭션 상태 “성공” 업데이트 → 수신하는 쪽
결제: paySystem 업데이트
환불: RefundService 업데이트
카프카를 활용한 MSA → 패턴 2가지: 코레오그래피 사가/오케스트레이션 사가
트랜잭션_관리_SAGA_4장.pdf
4960.4KB

프로젝트에서 사용하는 것

분산 락 + 2PC

Prepare 단계
분산 락 사용 → 리소스 보호
준비 완료 → (락 유지) 준비 완료(Ready) 반환
Commit or Rollback 단계
Commit
Coordinator가 모든 참여 서비스에 commit 명령
각 서비스 데이터 커밋 + 분산 락 해제
Rollback
하나의 서비스라도 실패 → rollback 명령
서비스 변경된 내용 되돌림 + 분산 락 해제

시퀀스 다이어그램

Client: 결제 요청 → Server: 결제 생성 → Client: 성공 URL 반환 → Client: 성공 URL 접근 → Server: 결제 승인/실패 처리 → 상태 반환

결제 요청 흐름

트랜잭션 상태 “성공” → Settlement, Notification, Schedule 서비스에 Kafka로 전달
5분 동안 결제 X (transaction Pending) → Status FAILED

취소 요청 흐름

코드

환불 요청 흐름

트랜잭션 상태 “성공” → Settlement, Notification, Schedule 서비스에 Kafka로 전달

참고

Dead Letter Queue Kafka 메시지 소비자가 실패하는 경우 재처리를 위한 보상 로직