멱등성·작업 큐·사용량 원장: 반복 실행에도 결과를 지키는 운영 설계
네트워크 재시도와 중복 클릭이 있어도 작업과 과금이 한 번만 반영되도록 멱등성 키, 상태 전이, 사용량 원장을 설계하는 방법입니다.
SAG 기술 편집팀 ·
Markdown 내려받기운영 서비스는 같은 요청을 여러 번 받습니다
사용자가 버튼을 두 번 누르거나 네트워크가 끊겨 클라이언트가 요청을 다시 보낼 수 있습니다. 서버리스 함수도 처리 도중 종료된 뒤 재실행될 수 있습니다. 이런 환경에서 요청 한 번이 작업 두 건이나 사용량 이중 차감으로 이어지면 결과를 신뢰하기 어렵습니다.
멱등성은 같은 의도의 요청이 반복되어도 최종 효과가 한 번만 발생하게 만드는 성질입니다. SAG는 생성·실행 요청에 논리적인 멱등성 키를 연결하고, 이미 처리 중이거나 완료된 키라면 기존 결과를 반환하는 구조를 사용합니다.
작업 상태를 명시적으로 관리하기
시간이 오래 걸리는 점검은 요청 안에서 끝내기보다 작업 큐로 넘겨 상태를 관리하는 편이 안전합니다.
- queued: 실행을 기다리는 상태
- running: 작업자가 처리 중인 상태
- succeeded: 결과와 정산이 완료된 상태
- failed: 재시도 가능한 실패 상태
- dead-letter: 자동 재시도 한도를 넘겨 운영 확인이 필요한 상태
상태 전이는 데이터베이스에서 원자적으로 처리해야 두 작업자가 같은 건을 동시에 가져가지 않습니다. 재시도 횟수와 다음 실행 시각도 함께 기록하면 일시적인 외부 장애와 지속적인 오류를 구분할 수 있습니다.
사용량은 값이 아니라 원장으로 남깁니다
현재 사용량 숫자만 덮어쓰면 언제 어떤 작업으로 증가했는지 확인하기 어렵습니다. 사용량 원장은 예약, 확정, 취소를 각각의 기록으로 남깁니다. 작업을 시작할 때 한도를 예약하고 성공하면 확정하며, 실행 전에 실패하면 예약을 되돌립니다. 같은 작업 키의 정산은 한 번만 허용합니다.
실패를 포함한 운영 검증
정상 성공 외에도 중복 제출, 작업자 충돌, 제한 초과, 실패 후 재시도, 완료 뒤 동일 요청을 테스트해야 합니다. 멱등성과 원장은 사용자가 보는 기능은 아니지만 “버튼은 한 번 눌렀는데 왜 두 번 차감됐나요?” 같은 운영 사고를 막는 핵심 아키텍처입니다.
