결제 플로우 수립 #15
wlgns12370
started this conversation in
General_KR
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
배경
결제 도입이 확정되면서, 신청과 결제를 하나의 트랜잭션으로 결합할지, 두 단계로 분리할지 결정이 필요합니다.
전제가 되는 제약은 다음과 같습니다.
BRANCH_TIME_SLOT행 하나의 락을 잡고 지나갑니다.해결방안
방안 1: 결합 (신청 + 결제 단일 요청)
서버가 한 요청 안에서 슬롯 락 획득 → 재고 차감 → PG 승인 호출 → 응답에 따라 커밋 또는 롤백까지 수행합니다. 클라이언트는 요청을 한 번만 보내면 됩니다.
핵심 문제가 그림에 그대로 드러납니다 — 슬롯 비관락(discussion.md 방안 A)의 점유 구간 안에 외부 호출(PG)이 들어가면서, 락 점유 시간이 우리 코드가 아니라 PG 응답 속도에 종속됩니다. 즉 동시에 요청한 사용자가 다른 사용자가 결제할때까지 기다려야하는 상황이 발생할 수 있습니다.
방안 2: 분리 (선점 → TTL 내 결제)
결제를 하기 전에 자리가 먼저 선점되고, 자리를 반납하기 전에 돈의 상태를 먼저 확인하는 구조입니다. 락이 필요한 작업(①선점)과 외부 시스템이 개입하는 작업(②결제, ③승격)이 서로 다른 로컬 트랜잭션으로 분리되고, 그 사이의 유실은 하단의 워커·아웃박스 릴레이가 메웁니다.
오류 전파 비교 — 동일한 오류, 다른 결과
결제 오류의 발생 확률은 두 방안이 동일합니다. 달라지는 것은 오류가 터졌을 때의 결과와 복구 경로입니다.
방안별 장단점
PENDING_PAYMENT상태 추가, TTL 2개(결제 5분 + 픽업 2시간)정리하면 방안 1의 장점은 전부 "정상 경로가 단순하다"에 있고, 방안 2의 장점은 전부 "오류가 터졌을 때 싸게 끝난다"에 있습니다. 결제는 카드 거절만 몇 %에 이르는, 오류가 일상인 도메인입니다.
분리(방안 2)의 단점과 완화책
USER_SANCTION)를 그대로 재사용RESERVATION_EVENT테이블 승격의견 수립
우리팀은 아래와 같은 이유로 인해 방안 2를 채택했습니다.
의견 요청
궁금한 점은 다음과 같습니다.
All reactions