충돌 해결
두 명 이상의 사용자가 동일한 데이터를 독립적으로 변경할 때 충돌이 발생합니다. 이는 장치와 서버 간의 지연 시간 또는 연결 끊김으로 인해 발생할 수 있습니다. 이 이벤트 Atlas Device Sync 는 자동으로 충돌 해결 전략을 사용하여 변경 사항을 병합합니다. 구체적으로 Device Sync 는 강력한 궁극적 일관성 을 보장하는 규칙 설정하다 인 연산 변환 을 사용하여 충돌 해결 을 처리하므로, 모든 클라이언트의 버전이 결국 동일한 상태로 수렴됩니다. 이는 다른 순서로 변경된 경우에도 마찬가지입니다.
일관적인벅 결과를 얻으려면 규칙을 숙지해야 하지만, 이러한 규칙을 따르면 디바이스가 완전히 오프라인으로 작동하면서도 서로 만날 때 의미 있는 결과를 도출할 수 있다는 장점이 있습니다.
이 페이지에서는 반려견 산책 앱 의 예시 를 사용하여 Device Sync 가 충돌을 해결하는 방법을 설명합니다. 이 앱 에서 맷과 사라는 모두 이 앱 을 사용하여 고객의 반려견과 산책 일정을 추적 하는 애견 산책자입니다.
충돌 해결 규칙
대략적으로 규칙은 다음과 같습니다.
- 삭제가 항상 우선합니다.
- 한 쪽에서 객체를 삭제하면 다른 쪽에서 나중에 변경하더라도 해당 객체는 항상 삭제된 상태로 유지됩니다.
- 마지막 업데이트가 우선합니다.
- 양쪽에서 동일한 속성을 업데이트하는 경우 Device Sync는 가장 최근 업데이트의 값을 유지합니다.
- 목록에 삽입된 항목은 시간별로 정렬됩니다.
- 동일한 위치에 두 항목을 삽입하면 먼저 삽입된 항목이 다른 항목보다 먼저 삽입됩니다. 즉, 양쪽 모두 목록 끝에 항목을 추가하면 삽입 시간 순서대로 두 항목이 모두 포함됩니다.
- 기본 키는 객체 ID를 지정합니다.
- 양쪽 모두 동일한 기본 키를 사용하여 동일한 클래스의 객체를 생성하는 경우, 동일한 객체의 인스턴스로 처리됩니다.
예시
두 사용자 간의 충돌 해결
태선씨와 수진씨는 반려견 산책 사업을 위한 데이터 작업을 하고 있습니다. 태선씨는 더 이상 산책 서비스를 이용하지 않는 고객의 반려견인 보리에 대한 데이터를 삭제합니다. 수진씨는 인터넷에 연결되어 있지 않은 사이에 태선씨가 보리의 데이터를 삭제한 사실을 모르고 로컬 오프라인 버전에서 보리의 필수 산책시간 데이터를 편집합니다.
수진씨가 인터넷에 다시 연결되면 변경 사항이 서버로 전송됩니다. 서버가 태선씨의 삭제 작업을 전송합니다. Device Sync의 충돌 해결 규칙에 따라 삭제는 항상 우선하므로 수진씨의 편집 내용이 아닌 태선씨의 삭제 내용이 그대로 유지됩니다. 서버는 수진씨가 편집한 내용을 태선씨의 장치로 보내지 않습니다. 데이터는 태선씨와 수진씨의 장치 전체에서 다시 일치합니다.
특별 고려 사항
카운터
계산에 정수를 사용하는 것은 특별한 경우입니다. 대부분의 프로그래밍 언어가 증가 연산(예: v
+= 1
)을 구현하는 방식은 값을 읽고 결과를 증가시킨 다음 다시 저장하는 것입니다. 여러 당사자가 동시에 증분을 수행하는 경우 이 방법은 분명히 작동하지 않습니다. 예를 들어 둘 다 10을 읽고 11로 증분한 후 병합하면 의도한 12가 아닌 11의 결과가 나올 수 있습니다.
이러한 일반적인 경우를 지원하기 위해 값을 증가(또는 감소)시키는지 여부를 표현하는 방법을 제공하여 병합이 올바른 결과에 도달할 수 있도록 충분한 힌트를 제공합니다. 전체 값을 업데이트하거나 더 많은 의미를 전달하는 방식으로 편집하여 충돌 해결을 보다 정확하게 제어할 수 있습니다.
중첩된 컬렉션
중첩된 컬렉션은 포함된 객체와 유사하게 처리됩니다. 즉, 특정 상위 객체가 있는 하위 객체로 간주됩니다. 상위 객체에 대한 모든 업데이트는 하위 객체를 덮어쓰더라도 항상 충돌 해결에서 우선합니다.
중첩된 컬렉션에 대한 업데이트는 다음과 같이 해결됩니다.
여러 장치가 동일한 기존 중첩 컬렉션을 업데이트 하는 경우 Device Sync는 일반적인 충돌 해결 규칙을 사용하여 두 변경 사항을 모두 통합합니다.
여러 장치가 동일한 상위 객체에 중첩된 고유한 새 컬렉션을 만드는 경우 "마지막 업데이트가 우선" 규칙이 적용되고 Device Sync는 마지막 업데이트로 다른 모든 업데이트를 덮어씁니다.
예를 들어, 수진씨와 태선씨의 반려견 산책 앱에 있는 클라이언트 세부 정보는 상위 client
속성에 중첩된 배열로 모델링됩니다. 수진씨와 나중에 태선씨는 각각 오프라인 상태에서 자신의 기기에서 동일한 클라이언트에 대한 새로운 세부 정보 컬렉션을 만듭니다. 장치가 동기화될 때, Matt의 업데이트(새 중첩 세부 정보 컬렉션 생성)가 마지막으로 수행된 업데이트였기 때문에 Device Sync는 Matt가 만든 항목을 유지합니다.
나중에 Sarah와 Matt는 각각 새로 생성된 세부 정보 항목을 고유하게 업데이트합니다. Device Sync는 일반적인 충돌 해결 규칙에 따라 이러한 업데이트를 병합하여 새 항목 또는 수정된 항목을 시간 순서대로 목록에 삽입합니다.
문자열
Device Sync는 문자열 값을 전체적으로 해석하며 문자별로 충돌을 병합하지 않습니다. 예를 들어, 문자열 내에 문자나 하위 문자열이 삽입되거나 삭제되면 Device Sync에서 이를 문자열의 전체 값을 대체하는 것으로 처리합니다.
딕셔너리 (Dictionaries)
Device Sync 는 사전 키 제거를 삭제가 아닌 업데이트 로 간주합니다. 따라서 '항상 삭제하는 항목이 우선' 규칙 대신 '마지막 업데이트 가 우선' 규칙이 적용됩니다.
예를 예시, 반려견 산책 앱 에는 키-값으로 입력되는 각 반려견에 대한 세부 정보 컬렉션 이 선택적으로 포함되어 있습니다. 두 사용자가 모두 오프라인 상태인 동안 Sarah는 개에 대한 전체 favorite toy
항목을 삭제하고, 나중에 Matt는 같은 개가 좋아하는 장난감을 tennis ball
으)로 업데이트합니다. 둘 다 온라인 가 되면 Device Sync 는 둘 다 favorite toy
항목에 대한 업데이트로 간주하고 태선씨가 수진씨를 삭제한 후에 업데이트했기 때문에 적용합니다.
사용자 지정 충돌 해결
일반적으로 Device Sync의 충돌 해결은 대부분의 용도에 적합하며 사용자 지정할 필요가 없습니다. 즉, 사용자 지정 충돌 해결을 수행하는 일반적인 방법은 속성 유형을 문자열에서 목록으로 변경하는 것입니다. 그러면 각 측에서 목록에 업데이트를 추가하고 원하는 충돌 해결 규칙을 데이터 모델에 직접 적용할 수 있습니다. 이 기술을 사용하여 최대, 최소, 첫 번째 쓰기 우선, 마지막 쓰기 우선 또는 생각할 수 있는 다른 종류의 해결 방법을 구현할 수 있습니다.
요약
Device Sync는 충돌 해결 시스템을 구현하여 여러 작성자가 오프라인에서 동시에 글을 쓰면서도 결국 동일한 결과물에 수렴할 수 있도록 합니다.
- 충돌 해결 시스템은 네 가지 규칙을 따릅니다.
삭제가 항상 우선합니다.
마지막 업데이트가 우선합니다.
목록에 삽입된 항목은 시간별로 정렬됩니다.
기본 키는 객체 ID를 지정합니다.
카운터, 중첩된 컬렉션 및 문자열은 클라이언트 코드에서 주의해야 할 특별한 경우입니다.