실천의 최종 일관성
최종 일관성 (EC) 은 데이터 사본이 일시적으로 분기 될 수 있지만 결국 글로벌 조정없이 수렴하는 모델입니다. 불변, 병합 규칙 및 고객 보증이 올바르게 정의 된 경우 이는 높은 가용성 (CAP 별 AP) 및 낮은 대기 시간 (PACELC) 의 핵심입니다.
1) EC를 선택할 때 (및 그렇지 않은 경우)
적합:- 피드, 프로필, 좋아요/카운터, 디렉토리/검색, 캐시 된 보기.
- 로컬 항목 및 소프트 불변량이있는 글로벌 시스템.
- 진실의 원천이 엄격한 커널이고 판독 값이 비동기식 인 프로젝션 (CQRS).
- 어려운 불변: 돈, 독창성, 한계, 재고 "는 마이너스로 들어 가지 않습니다. "CP/더 강한 EC, sagas/TSS.
2) EC 데이터 설계: 충돌 및 해결
원리: 각 레코드에는 버전 메타 데이터 및 결정 론적 병합 기능이 있습니다.
타임 스탬프/버전: '버전', 'ts', '배우'.
벡터 시계: 인과 관계를 수정하고 "상충되는 유사점" 을 이해할 수 있습니다.
합병 규칙은 다음과 같습니다
LWW (Last-Write-Wins): 간단하고 빠르지 만 "의미" 를 잃을 수 있습니다.
CRDT: 정류/dedempotent 구조, 수렴 보장.
도메인 병합: 비즈니스 기능 (예: 중복없이 병합 목록, 합산 카운터, "최신 이메일 + 태그 병합").
- G-Counter/PN-Counter → 카운터.
- OR-Set → 세트 ("고착없이 삭제").
- 레지스터 → LWW 등록 ("손실" 에주의하여).
- 지도/문서 → CRDT의지도.
- 공동 저작 → 텍스트 CRDT/OT.
3) 복제 및 엔트로피 방지
가십/안티 엔트로피: 노드 간 상태/해시의주기적인 교환.
힌트 핸드 오프: 액세스 할 수없는 노드에 대한 항목을 일시적으로 "증착" 합니다.
수리를 읽으십시오: 읽을 때 불일치가 발견되었습니다. 최신 버전을 가져 왔습니다.
패키지 변경 (델타): 전체 샷이 아닌 델타를 구동합니다.
쿼럼 R/W: 속도와 신선도를 손상시키기 위해 'R', 'W', 'N' 을 조정하십시오 (예: 'R + W> N' 은 "마지막 기록" 에서 강세에 가깝습니다).
4) EC에 대한 고객 보증
RYW (Read-Your-Writes): 저자는 녹음 후 그것을 본다 (sticky-sesion/version marking).
단조로운 읽기: 클라이언트를 이전 값으로 "롤백" 하지 마십시오 (최신 버전을 워터 마크로 유지).
인과 일관성: 세션/동작 흐름 (헤더/토큰의 벡터 레이블) 내에서 인과 관계를 유지합니다.
Bounded Staleness: UX 임계 화면에 대한 보증 "
5) EC를위한 UX 패턴
낙관적 인 업데이트: "동기화" 를 표시하여 동작을 즉시 반영합니다.
신선도 표시: 배지 "X 초 전에 업데이트 됨", 버튼 "업데이트".
충돌 UI: 드문 충돌의 경우- "버전을 표시하고 선택/결합".
해골/자리 표시 자 + 소프트 새로 고침: 전역 정족수를 기다려 UI를 차단하지 마십시오.
6) 건축 템플릿
6. 1 CQRS + 프로젝션
쓰기 커널 (CP): 엄격한 불변량.
판독 평면 (EC): 비동기 투영, 색인, 캐시; 지연이 허용됩니다.
6. 2 AP 다중 지역
로컬로 빠르게 쓰고 비동기식으로 복제하십시오.
지리 분할: 데이터는 사용자에게 더 가깝습니다. 교차 지역-집계.
CRDT/병합 기능은 갈등의 고통을 완화시킵니다.
6. 3 쿼럼 튜닝
yaml consistency:
replicas: 3 # N write_quorum: 2 # W read_quorum: 2 # R => R + W> N, closer to freshness on "last record"
read_repair: true hinted_handoff: true
7) 정책 수정 및 병합 (예)
yaml entity: "profile"
versioning:
clock: "vector" # или "hybrid_time"
fields:
name: { merge: "lww" }
emails: { merge: "set_union" } # OR-Set tags: { merge: "or_set" }
likes: { merge: "pn_counter" }
conflict_ui:
enabled: true show_diff_for: ["name"]
auto_merge_for: ["emails","tags","likes"]
8) EC 관찰 가능성: 측정 대상
스탈린스 연령 (p50/p95/p99): '현재 -data _ version _ ts' 또는 "지연 버전 수".
복제 래그: 지역/사이트 간 배송 지연.
충돌률: 병렬 업데이트 비율, 유형 별 분포.
읽기 수리 속도/대기 시간: 읽을 때 얼마나 자주 그리고 얼마나 빨리 "취급" 합니까?
수렴 시간: 레코드/노드 오류 발생 후 수렴 시간.
시맨틱 SLO: "프로파일의 95% 가 2를 넘지 않습니다", "피드의 99% 가 <10을 수렴합니다".
9) 런북 '및 사건
시나리오:1. 지역간 성장 지연: '쓰기 팬 아웃' 감소, 공격적인 읽기 수리, 트롤 무거운 작가 포함.
2. 충돌의 급증: 일시적으로보다 "엄격한" 규칙 (예: 인과/RYW) 을 활성화하면 핫 키의 경쟁 업데이트가 제한됩니다.
3. 투영 지연: 복제 대기열의 우선 순위를 정하고 중요하지 않은 업데이트 빈도를 일시적으로 줄입니다.
4. 강제 엔트로피, 당사자 재조정, 핸드 오프 감사와 같은 일부 노드에서 데이터가 "고착" 되었습니다.
5. 수동 분석: 상충되는 키 언로드, "병합 미리보기" 도구, 전투 수정.
10) EC 테스트
Jepsen과 같은 테스트: 네트워크 분할, 클럭 왜곡, 재 작성.
속성 기반: 병합 함수의 불변 (정류성, demempotency, 연관성).
퍼즈 충돌: 가변 배송 순서로 하나의 키에 대한 병렬 업데이트.
"톱" 을로드하십시오: 수렴 시간을 평가하기 위해 교대로 버스트/룰러.
UX 시뮬레이션: 일반적인 시나리오에서 RYW/단조 가시성.
11) 다중 임차인 및 계획
태그 '테넌트 _ id/플랜/지역' 이벤트/레코드.
공정성: "잡음" 클라이언트가 전반적인 정체성을 증가시키지 않도록 임차인 당 복제/수리가 제한됩니다.
거주지: 관할 구역 내 데이터 및 복제본; 지역 간 전망은 집계됩니다.
12) 전형적인 오류
모든 것을위한 LWW ". "의미 적 병렬 변화를 잃는다; CRDT/도메인 병합 사용.
고객 보증은 없습니다. 사용자는 자신의 기록 → 신뢰 상실을 "보지 못한다".
노후화의 관찰 가능성이 없습니다. 부실성/지연 → "숨겨진 분해" 메트릭은 없습니다.
병합하지 않고 다른 시스템에 이중 쓰기. 팬텀과 발산은 무한합니다.
모든 비용의 글로벌 주문. 추가 쿼럼은 p95를 죽이고 지역 주문은 기업에 충분합니다.
13) 빠른 레시피
피드/테이프: 저자의 경우 EC + 인과/RYW, 반응에 대한 CRDT, 부실성 p95 λ2-5c.
프로필/설정: 경계 부실성 (λ1-2c), RYW, 도메인 병합 (유니온 세트).
글로벌 카탈로그: 지리 파티션, 비동기 복제, 주문형 읽기 수리, OR-Set을 통한 충돌.
메트릭/카운터: PN-Counter, 백그라운드에서의 통합; 라벨에 "대략적인" 값을 표시합니다.
14) 미니 표준 (언어 체계)
쓰기 에지: 버전 ('벡터/하이브리드'), 이벤트 로그가있는 로컬 레코드.
복제: о' ере함수 + 가십/안티 엔트로피, 암시 된 핸드 오프.
스토리지: 키 단위로 분할하면 쓰기 수준에서 CRDT/병합 함수가 나타납니다.
읽기 평면: 읽기 수리, RYW/단조 토큰이있는 캐시, 중요한 화면의 경계 정지.
관찰 가능성: 지연/노후화/충돌, SLO 스텔스 초과 경고.
15) 사전 판매 점검표
- 불변량과 EC가 허용되는 곳을 명확하게 설명합니다.
- 벡터/하이브리드 및 병합/CRDT 결정 기능이 선택됩니다.
- 중요한 UX에 대한 고객 보증 (RYW/monotonic/causal) 을 구현했습니다.
- 복제, 읽기 수리, 암시 된 핸드 오프 구성; R/W 쿼럼이 문서화되어 있습니다.
- 부실성/지연/수렴 지표 및 p95/p99 임계 값 경고.
- 런북 '과 갈등/지연의 성장; 안전한 손 병합 도구.
- 네트워크 파티션, 병렬 업데이트 및 수렴 속성에 대한 테스트.
- 다중 임차인 제한 및 거주 정책이 고려됩니다.
- UX 신선도 표시기 및 대체 동작은 제품과 일치합니다.
결론
최종 일관성은 "타협을위한 타협" 이 아니라 확장 성 및 가용성 도구입니다. 불변량을 공식화하고 올바른 병합 기능을 선택하고 (적절한 경우 CRDT) 고객에게 보증을 제공하고 부실성과 수렴 시간을 측정하면 시스템은 사용자와 비즈니스 모두에게 빠르고 안정적이며 정직합니다.