WEBBOOK CHAPTER

실패를 전제로 설계하는 분산시스템: 5장. 멱등성은 키 저장이 아니라 결과 계약이다

5장. 멱등성은 키 저장이 아니라 결과 계약이다

같은 요청을 두 번 받아도 같은 효과를 내야 한다. 키의 범위는 tenant·행동·자원 단위로 정하고, 요청 본문 해시와 첫 결과를 함께 저장한다. 같은 키에 다른 본문이 오면 충돌로 거절한다. 처리 중·성공·실패의 수명주기와 보관 기간도 설계한다.


create table command_receipt (
  tenant_id text not null,
  command_key text not null,
  request_hash text not null,
  status text not null check (status in ('processing','succeeded','failed')),
  response_json jsonb,
  primary key (tenant_id, command_key)
);

클라이언트가 키를 재사용하는 버그, 서버가 응답 전에 죽는 경우, 장시간 processing에 갇힌 경우를 시험한다. 멱등성은 무한 보관이 아니므로 도메인의 재시도 창과 감사 요구로 TTL을 정한다.