최종 일관성: 잠시 다른 값을 보여도 수렴한다는 계약
최종 일관성은 새 갱신이 더 이상 발생하지 않고 필요한 전파와 병합이 계속 이루어지면, 같은 데이터를 보관한 사본들이 결국 같은 상태로 수렴한다는 보장이다. 모든 읽기가 최신 값을 반환한다거나 일정한 시간 안에 수렴한다는 뜻은 아니다.
최종 일관성은 조건을 만족할 때의 수렴을 뜻하며 모든 읽기의 최신성이나 고정된 수렴 시간을 보장하지 않는다.
전파가 늦으면 관찰도 다르다
좋아요 수가 10인 게시물에 새 좋아요 하나가 반영되어 사본 A는 11이 되었지만 B는 아직 10일 수 있다. A를 읽은 사용자와 B를 읽은 사용자는 다른 수를 본다. 갱신이 B까지 전달되고 더 이상 변화가 없다면 두 값이 11로 맞춰진다.
Time 0: replica A=10, replica B=10
Time 1: new update arrives at A -> A=11, B=10
Time 2: clients may observe 11 or 10
Time 3: update reaches B -> A=11, B=11
Assumption: no further updates and propagation eventually succeeds.
전파가 영원히 끊긴 사본까지 무조건 같아진다고 보장할 수는 없다. 장애 복구와 메시지 전달, 병합 절차에 관한 가정이 필요하다. “최종”은 운영상 지연 목표와 별도로 수렴 성질을 말한다.
동시 변경은 전달만으로 해결되지 않는다
A와 B가 같은 초기 상태에서 각각 수정하면 두 변경을 어떤 의미로 합칠지 정해야 한다. 마지막 쓰기 우선은 충돌을 한 값으로 정리하지만 벽시계 오차와 데이터 손실을 고려해야 한다. 사용자가 한쪽 변경을 읽고 다른 값을 덮어썼는지, 서로 독립 변경인지도 다르다.
카운터를 두 사본이 모두 10에서 11로 바꾸고 최댓값만 취하면 실제 두 번 증가가 한 번으로 줄 수 있다. 노드별 증가량을 따로 저장해 합치는 등 연산의 의미를 보존하는 병합이 필요하다. 수렴한다는 사실만으로 모든 변경의 의도가 보존되는 것은 아니다.
read-your-writes를 추가하면 자기 변경 뒤에 이전 값을 보는 경험을 줄일 수 있다. 단조 읽기는 세션에서 버전이 뒤로 가지 않도록 한다. 이런 보완은 최종 일관성과 함께 제공할 수 있지만 자동으로 따라오지는 않는다.
일부 캐시, 검색 인덱스, 집계 화면은 오래된 값이 잠시 보여도 괜찮을 수 있다. 반면 재고 수량, 권한 변경, 중복 결제 같은 요구에는 잘못된 관찰이 실제 불변식을 깨뜨릴 수 있다. 데이터 종류와 작업별로 허용 가능한 지연과 충돌을 정해야 한다.
운영에서는 복제 지연 분포, 오래된 읽기 비율, 병합 충돌, 복구 진행을 측정한다. 이론적 수렴 보장은 몇 초 안에 최신이라는 서비스 목표를 대신하지 않는다. 어떤 상황에 최신성이 필요한지와 무엇이 수렴해야 하는지를 구체적으로 정의할 때 모델의 장점을 활용할 수 있다.
삭제도 하나의 갱신으로 전파해야 한다. 오래된 사본의 값이 나중에 도착해 지운 데이터가 되살아나지 않도록 삭제 표식이나 버전 규칙을 사용할 수 있다. 표식을 정리하는 시점도 뒤처진 사본의 복구 가능성과 연결된다. 수렴 대상에는 새 값뿐 아니라 삭제의 의미도 포함된다.