문제 상황

❗ StepFunction 기반 결제 프로세스

• 스타벅스의 결제는 StepFunction을 활용하여 순차적으로 진행

• 주요 단계: 주문 생성 → 결제 진행 → 주문 완료 → 매장 주문 전송

❗ 외부 서버 응답 지연으로 인한 결제 중복 발생

• 스타벅스 카드(충전 및 결제)와의 외부 통신 서버가 미국에 위치하여 간헐적으로 응답 시간이 길어짐

결제 StepFunction 타임아웃: 20초 / 외부 서버 재시도 규정: 10초

10초 이상 응답이 지연될 경우, 기존 요청에 대한 응답을 기다리는 대신 새로운 요청을 전송

결제 StepFunction이 종료되기 전에 중복 결제가 발생하여, 결제는 두 번 이루어졌지만 주문이 생성되지 않는 문제 발생


해결 방법

✏️ FeignClient 재요청(Retry) 로직 커스터마이징

결제 요청의 재시도 전략을 수정하여 중복 결제 방지

I/O Exception 중 ReadTimeout의 경우 재시도하지 않고 즉시 실패 처리

멱등성이 보장되는 요청(조회 등)에 대해서는 기존의 Default Retry 설정 유지

✏️ Spring Cloud FeignClient Customizing

FeignClient 내부의 RetryableException 발생 지점 분석

Retryer 인터페이스를 상속받아 재시도 로직을 직접 오버라이딩