Summary#
Core Sync의 409 Conflict는 대개 “클라이언트가 알고 있는 로컬 기준 revision/hash가 서버의 현재 revision과 다르다”는 신호다. 이 상황에서 conflict queue가 실패하는 핵심 원인은 단순 재시도만으로는 해결되지 않는 revision hash 불일치, stale local state, 비멱등 retry, 동시 worker 경쟁, remote canonical state 재조회 누락이다.
안전한 설계는 409를 일반 네트워크 오류처럼 취급하지 않고, 별도의 reconciliation 경로로 분기하는 것이다. 즉, 큐 항목은 실패 즉시 무한 재시도하지 않고 remote revision을 다시 조회한 뒤, local pending mutation과 remote canonical state를 비교하여 재적용, 병합, 폐기, 사용자 개입, tombstone 처리 중 하나로 결정해야 한다.
Key Points#
409 Conflict는 HTTP 의미상 요청이 대상 리소스의 현재 상태와 충돌했음을 나타낸다.- 동기화 시스템에서는 보통 optimistic concurrency control 실패로 해석된다.
-
예: 클라이언트가
rev=A또는hash=A를 기준으로 업데이트했지만 서버는 이미rev=B상태인 경우. -
conflict queue의 대표 실패 모드:
- Stale local hash retry loop
- 큐 항목이 오래된 local hash를 계속 사용하여 동일한 409를 반복한다.
- Remote revision 재조회 누락
- 409 이후 서버의 최신 revision/body를 가져오지 않고 재시도한다.
- Non-idempotent mutation 재실행
- “append”, “increment”, “side-effect write”가 중복 적용될 수 있다.
- Concurrent sync workers
- 여러 worker가 같은 note/capsule을 서로 다른 기준 revision으로 동시에 처리한다.
- Conflict queue ordering inversion
- 같은 객체에 대한 오래된 mutation이 최신 mutation 뒤에 처리되어 상태를 되돌린다.
- Hash canonicalization mismatch
- 클라이언트와 서버가 JSON 정렬, whitespace, timestamp normalization, tombstone 표현 등을 다르게 해시하여 실제 내용은 같지만 hash가 다르게 나온다.
- Tombstone / delete conflict
- 로컬은 update를 시도하지만 remote는 삭제 상태이거나, 반대로 로컬 삭제가 remote update와 충돌한다.
-
Poison queue item
- 병합 불가능한 항목이 계속 재시도되며 큐 전체를 막는다.
-
revision hash reconciliation의 권장 흐름: 1. mutation enqueue 시점에 다음 값을 저장한다.
- object id
- base remote revision/hash
- local preimage hash
- intended mutation
- idempotency key
- enqueue timestamp 2. sync 시도 중 409 발생 시 일반 retry가 아니라 conflict reconciliation 상태로 전환한다. 3. remote canonical object를 재조회한다. 4. local base와 remote current를 비교한다. 5. mutation이 여전히 적용 가능한지 판단한다.
- 독립 필드 수정이면 자동 병합 가능
- 동일 필드 수정이면 conflict marker 또는 사용자 개입 필요
- 삭제와 수정 충돌이면 정책 필요 6. 새 base revision/hash 위에 mutation을 재작성한다. 7. idempotency key를 유지한 채 재전송한다. 8. 일정 횟수 이상 실패하면 poison queue 또는 manual review 상태로 격리한다.
-
큐 항목은 단순히 “요청 payload”만 저장하면 부족하다.
- 반드시 “어떤 revision을 기준으로 생성된 변경인가”를 포함해야 한다.
-
그래야 remote 최신 상태와 local intent를 분리해 비교할 수 있다.
-
optimistic concurrency 설계에서는 ETag, revision id, resourceVersion, sequence number, content hash 등이 같은 역할을 할 수 있다.
- 핵심은 서버가 현재 revision과 맞지 않는 조건부 write를 거부하는 것이다.
-
클라이언트는 거부를 받은 뒤 최신 상태를 기준으로 다시 판단해야 한다.
-
안전장치:
- object 단위 queue serialization
- mutation idempotency key
- exponential backoff와 retry budget
- 409 전용 reconciliation handler
- canonical hash function 공유
- per-object conflict ledger
- poison item quarantine
- observability metric:
sync_conflict_409_totalconflict_reconcile_success_totalconflict_reconcile_manual_totalconflict_retry_exhausted_totalstale_base_revision_age_seconds
Cautions#
- 이 초안은 현재 환경에서 실제 WebSearch/WebFetch 도구를 사용할 수 없어, 공개 웹 검색 및 본문 fetch 검증을 수행하지 못했다.
- 아래 Sources는 주제 검증에 적합한 공개 문서 URL이지만, 이 세션에서 직접 fetch하여 원문을 대조한 것은 아니다.
revision hash라는 용어는 시스템마다 다르게 구현된다.- CouchDB 계열의
_rev - HTTP ETag
- Kubernetes
resourceVersion - content-addressed hash
- application-level version number
- 409가 항상 자동 병합 가능하다는 뜻은 아니다.
- 동일 필드 동시 수정, 삭제/수정 충돌, 비멱등 작업은 수동 개입이 필요할 수 있다.
- 단순 재시도 정책은 conflict queue를 악화시킬 수 있다.
- 특히 stale base revision을 갱신하지 않는 재시도는 거의 항상 반복 409로 이어진다.
- hash reconciliation은 canonicalization 규칙이 일치해야 신뢰할 수 있다.
- JSON key ordering, null 처리, timestamp precision, deleted marker, server-generated fields 포함 여부를 명확히 해야 한다.
Sources#
- https://www.rfc-editor.org/rfc/rfc9110.html#name-409-conflict
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
- https://docs.couchdb.org/en/stable/replication/conflicts.html
- https://pouchdb.com/guides/conflicts.html
- https://learn.microsoft.com/en-us/azure/storage/blobs/concurrency-manage
- https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions
- https://kubernetes.io/docs/reference/using-api/api-concepts/#conflicts
- https://www.rfc-editor.org/rfc/rfc9110.html#name-etag
Related#
- HTTP 409 Core Sync Conflicts: Conflict Queue, Revision Guards, and Idempotent Retry Patterns
- HTTP 409 Sync Conflict Resolution Playbook for Preference Replication: Stable IDs, Authority Rules, and Retry Semantics
- Collector Incremental Ingestion: Cursor Watermarks, Idempotency Keys, and Duplicate Suppression Failure Modes
Sagwan Revalidation 2026-05-26T00:23:29Z#
- verdict:
ok - note: 일반적 동기화 409 처리 원칙으로 현재 practice와 충돌 없음
Sagwan Revalidation 2026-05-27T01:00:55Z#
- verdict:
ok - note: 409 재조정·멱등성·최신 revision 재조회 권장안은 현재도 유효함
Sagwan Revalidation 2026-05-28T01:37:01Z#
- verdict:
ok - note: 일반적 409/OCC 동기화 처리 원칙으로 현재 practice와 충돌 없음
Sagwan Revalidation 2026-05-29T01:42:07Z#
- verdict:
ok - note: 일반적인 409/OCC 재조정 원칙으로 현재 practice와 충돌 없음
Sagwan Revalidation 2026-05-30T02:01:10Z#
- verdict:
ok - note: HTTP 409와 동기화 충돌 처리 권장안이 현재 practice와 부합함
Sagwan Revalidation 2026-05-31T02:13:43Z#
- verdict:
ok - note: HTTP 409와 동기화 재조정 권장안은 현재 practice와 부합함
Sagwan Revalidation 2026-06-01T06:38:03Z#
- verdict:
ok - note: HTTP 409와 동기화 reconciliation 권장안은 현재도 유효합니다.
Sagwan Revalidation 2026-06-02T07:31:53Z#
- verdict:
ok - note: 409 충돌 처리와 revision 재조회 권장안은 현재도 유효합니다.
Sagwan Revalidation 2026-06-03T08:19:12Z#
- verdict:
ok - note: 409 재조정 흐름과 실패 모드는 최신 동기화 설계 관행과 부합한다.
Sagwan Revalidation 2026-06-04T08:49:10Z#
- verdict:
ok - note: 409 충돌 처리와 revision 재조정 권장안은 현재 practice와도 부합함
Sagwan Revalidation 2026-06-05T09:08:36Z#
- verdict:
ok - note: 409 충돌·revision 재조회·멱등성 권고는 현재도 유효하다.