--- id: kind: REFERENCE slug: unknown-is-a-third-result title: 모르는 것은 성공도 실패도 아닌 세 번째 결과여야 한다 topic: commit-ambiguity-as-a-result topicName: 커밋 모호성 — 「모른다」를 결과로 유지하기 project: clean-architecture-backend-template status: 게시 전 studio: "" source: - final/document.md#9 - final/document.md#3-3 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 --- # 모르는 것은 성공도 실패도 아닌 세 번째 결과여야 한다 완료 여부를 알 수 없는 상태를 성공이나 실패로 접으면 그 정보가 영원히 사라진다. 결과 타입에 세 번째 변형을 두고, 그 변형이 조정에 필요한 것을 함께 들고 다니게 한다. ## 관계 - **pg_terminate_backend 가 57P01 로 도착하고 커밋 레코드는 이미 WAL 에 있었다** 세 번째 결과가 필요한 대표 사례다. - **completion-unknown 은 자동으로도 수동으로도 재시도하지 않는다** 이 규칙을 정책으로 옮긴 결정이다. ## 목적 모르는 것을 실패로 접으면 재시도가 일어나고, 커밋됐을 수도 있는 쓰기가 중복된다. 성공으로 접으면 확인되지 않은 작업이 확인된 것으로 하류에 흘러간다. 어느 쪽도 나중에 되돌릴 수 없다. ## 규칙 ### 1. 결과 타입에 세 번째 변형을 둔다 호출자가 재시도와 조정을 구별하려면 그 구별을 담을 값이 필요하다. boolean 하나나 예외 하나로는 표현되지 않는다. ### 2. 세 번째 변형은 조정 정보를 함께 들고 다닌다 상태 이름만으로는 부족하다. 마지막으로 관측된 단계와 조정에 쓸 안정적인 식별자가 값 안에 있어야 조정이 대상을 지목한다. ### 3. 판정 조건을 좁게 유지한다 조정 큐가 커지면 운영자가 읽지 않고 비우는 습관을 배우고, 중요했던 한 건이 나머지와 같이 지워진다. ## 적용 조건 관측이 결과를 확정하지 못할 수 있는 경계 : 커밋, 발행, 전달, 복제 지연 조회 이 저장소의 구현은 다섯이다. 재시도 처분 : RetryDisposition.RECONCILE 트랜잭션 결과 : TransactionResult.Indeterminate 쓰기 처분 : WriteDisposition.UNDETERMINED 발행 완료 : PublishCompletion.AMBIGUOUS 복제 지연 : ReplicaLagMonitor.replayedThrough 의 Optional 반환 ## 예외 아무것도 프로세스를 떠나지 않은 실패는 확정이다. 발행 경로에서 access 가 거부되거나 encode 가 실패하면 결과는 REJECTED 이고 ambiguous 가 아니다. 어떤 브로커도 보지 못한 메시지를 모호하다고 보고하면, 호출자는 확인할 것이 없는 조정으로 보내진다. 준비 중에 데드라인이 소진된 경우도 같다. 아직 전송 전이므로 확정 거부다. ## 예시 커밋 증거 열거형은 UNKNOWN 을 실제 상태로 두고, 드라이버가 커밋도 롤백도 확인해 주지 못한 경우를 어느 쪽으로도 접지 않는다. 발행 경로는 transport 단계에서 실패하거나 데드라인이 지나면 AMBIGUOUS 로 보고한다. 요청이 wire 위에 있었으므로 브로커가 들고 있을 수 있기 때문이다.