타임아웃 이후 재시도를 멱등하게 만들어야 하는 이유 #58
Replies: 4 comments
-
|
멱등하게 설계해야하는 api는 같은 요청이 두 번 처리되면 문제가 되는 API로, 몇 가지 예시를 작성해보았습니다.
위 예시들은 모두 재시도 가능성이 있고, 중복 처리가 되면 문제가 되는 API이며 이러한 경우 재시도를 멱등하게 보장해 안정성을 높여야합니다. Post 메서드에서 멱등성을 보장하는 방법은 클라이언트는 요청마다 고유한 멱등성 키를 헤더에 담아 보내고, 서버는 해당 키를 DB에 저장하고 상태 관리를 처리합니다.
이렇게 되면 클라이언트가 timeout 때문에 같은 요청을 다시 보내더다로, 같은 작업을 다시 수행하지 않고 3-2.에따라 이전 결과를 반환할 수 있습니다. |
Beta Was this translation helpful? Give feedback.
-
|
멱등성을 보장해야 하는 대상은 단순 조회보다는 상태를 변경하는 쓰기 연산 중에서도, 중복 실행됐을 때 비즈니스적으로 문제가 되는 도메인이라고 생각합니다. POST 요청에 멱등성을 부여하는 대표적인 방법은 Idempotency-Key를 사용하는 것입니다. |
Beta Was this translation helpful? Give feedback.
-
타임 아웃 이후 재시도를 멱등하게 만들어야 하는 이유요청이 타임 아웃이 되었다면 다음 두가지의 가능성이 존재합니다.
다음 두가지의 경우가 존재하는데, 멱등하지 만들지 않는다면, 그래서 같은 요청에 대해서 타임아웃 이후에 재시도를 멱등하게 만들어서 어떤 API와 도메인의 경우 재시도를 멱등하게 보장해야 할까요?실제 중복된 요청 처리가 되었을 때 큰 문제가 발생하는 API와 도메인이라면 재시도 멱등을 확실히 확보해야한다고 생각합니다. 멱등성을 보장하기 위해 POST 메서드에 구현 가능한 방식 하나를 소개해주세요.멱등키 Idempotency-Key로 멱등성을 보장할 수 있습니다. 실제로 토스 서버에서는 멱등 요청에 대한 식별을 다음과 같이 하고 있습니다.
이 조합이 같을 때 중복된 요청으로 판단하고 재시도시에 같은 요청에 대한 동일한 응답으로 반환한다고 합니다. 이전 디스커션에서도 비슷한 이야기 언급에 대해서 링크 남깁니다! |
Beta Was this translation helpful? Give feedback.
-
|
두 번 발생할 때 비즈니스적으로 문제가 발생할 수 있다면 멱등성을 고려합니다. (ex 예약) 비즈니스 로직 성공 여부가 외부 API에 의존하는 경우가 그 예시입니다.
멱등성을 보장하는 방법의 핵심은 '동작 수행 여부를 서버에 저장하는 것'이라 생각합니다. Header에 Idempotency-Key를 추가하고 서버에 이를 저장하는 게 그 예시입니다. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
어떤 API를 멱등하게 설계해야 할까요? Read Timeout인 경우에는 서버에서는 정상적으로 요청을 처리했지만, 응답만 받지 못한 상태일 수 있습니다.
Beta Was this translation helpful? Give feedback.
All reactions