Idempotency

멱등성은 요청 키 상태로 “처리할지, 돌려줄지, 기다릴지”를 판단한다

중복 요청을 단순히 무시하는 것이 아니라, 처리 중/성공/실패 상태와 이전 응답을 기준으로 같은 결정을 반복한다.

새 요청 경로

1 key 없음

request_id가 없으면 PROCESSING row를 유니크 키로 선점한다.

2 업무 변경 + 응답 저장

주문, 결제, 재고 변경과 응답 본문을 같은 트랜잭션 안에서 확정한다.

3A SUCCESS

재시도는 업무를 다시 실행하지 않고 saved response를 반환한다.

3B FAILED

재시도 가능/불가와 TTL을 정책으로 판단한다.

기존 키 경로

기존 SUCCESS

같은 응답을 즉시 반환한다.

기존 PROCESSING

잠시 뒤 재조회하거나 409로 충돌을 알린다.

기존 FAILED

같은 실패를 돌려줄지, 새 재시도를 허용할지 정책으로 정한다.

idempotency_key 저장 필드

request_id

클라이언트 요청 또는 event_id의 유니크 키

status

PROCESSING, SUCCESS, FAILED

response_hash/body

재시도 시 돌려줄 이전 결과

updated_at / ttl

멈춘 처리와 재시도 가능 시간을 판단

같은 경계

키 저장과 업무 변경을 한 트랜잭션 안에 둔다.

동시 중복

유니크 키와 PROCESSING 상태로 이중 실행을 막는다.

응답 재사용

성공한 요청은 저장된 응답을 돌려준다.