- analysis/·source-index·state.json 을 final/document.md 제2부·제3부로 접었다. SSOT 는 하나다 - 파일럿 — commit-ambiguity-as-a-result 를 새 기준으로 재선별. 후보 14 → 글감 5 (PROMOTE 5 · MERGE_INTO 3 · KEEP_IN_SSOT 4 · 보류 2). 기록 5건을 다시 썼고 그림 1개를 techviz 로 만들었다 - 재선별이 잡은 것: 제1부 §6.2·§11.1 이 자기 §13.2 와 어긋나 있었다(레인을 안 돌렸다 vs 돌렸다) — 정정. 이미 답이 나와 있던 Question 을 HEAD 재실행 질문으로 다시 세웠다. Concept 이 인용한 코드가 SSOT 에 없어 뺐다 - candidateScope·sourceRepository 기록. 나머지 43개 주제는 재선별 대기(PENDING 905) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
71 lines
3.2 KiB
Markdown
71 lines
3.2 KiB
Markdown
---
|
|
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 위에 있었으므로 브로커가 들고 있을 수 있기 때문이다.
|