- 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>
3.2 KiB
id, kind, slug, title, topic, topicName, project, status, studio, source, sourceRevision
| id | kind | slug | title | topic | topicName | project | status | studio | source | sourceRevision | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| REFERENCE | unknown-is-a-third-result | 모르는 것은 성공도 실패도 아닌 세 번째 결과여야 한다 | commit-ambiguity-as-a-result | 커밋 모호성 — 「모른다」를 결과로 유지하기 | clean-architecture-backend-template | 게시 전 |
|
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 위에 있었으므로 브로커가 들고 있을 수 있기 때문이다.