네트워크 실패가 default
앱이 네트워크로 DB 호출할 때마다, 호출이 세 가지로 실패 가능: DB 가 보기 전에, 처리 후 응답 도착 전에, 또는 성공. 앱 관점에서, "응답 못 받음" 이 "요청 도착 안 함" 또는 "요청 성공했지만 못 들음" 과 동일. 너 retry 가 어느 쪽이든 안전해야.
멱등 연산
연산이 멱등 = 두 번 (또는 스무 번) 실행이 한 번 실행과 같은 효과. SELECT 가 멱등. SET status = 'paid' 가 멱등. SET balance = balance - 100 은 아님. 자연스러워 보이는 많은 write 가 멱등 아님.
Write 멱등하게 만드는 패턴
- Insert 에
ON CONFLICT DO NOTHING또는DO UPDATE. - 클라이언트에서 idempotency key 전달; 테이블에 insert; 중복 거절.
- 가능하면 절대 update (
SET balance = ?) 사용, delta (SET balance = balance - ?) 대신. - 적용된 연산을 사이드 테이블에 추적 → 재실행 감지.