Atlas Device Sync 프로토콜
이 페이지의 내용
개요
Atlas Device Sync 는 프로토콜 을 사용하여 각각 로컬 Realm 파일을 유지 관리하는 여러 클라이언트 간에 데이터 변경 사항 실시간 정확하고 효율적으로 동기화 합니다. 이 프로토콜 은 사전 정의된 요청 유형 설정하다 와 Realm SDK 와 같은 클라이언트 가 Atlas App Services 애플리케이션 서버 에 연결하고 데이터를 동기화 할 수 있는 프로세스 를 정의합니다.
참고
Realm SDK는 내부적으로 동기화 프로토콜을 구현하고 managed하므로 대부분의 애플리케이션에서 Realm Mobile Sync를 사용하기 위해 동기화 프로토콜을 이해할 필요가 없습니다. 이 페이지는 프로토콜을 높은 수준으로 다루며 구현 사양이 아닙니다.
주요 개념
Changeset
변경 집합 은 하나 이상의 쓰기 작업을 통해 알려진 객체 상태 또는 버전에 대한 세부적인 수정을 설명하는 지침 목록입니다. 변경 세트는 동기화 프로토콜의 기본 단위입니다. 동기화된 realm 클라이언트는 쓰기 작업을 수행할 때마다 Realm Mobile Sync 서버로 변경 세트를 보냅니다. 서버는 다른 클라이언트가 실행한 쓰기 작업에 대해 연결된 각 클라이언트에 변경 집합을 보냅니다.
Device Sync 서버는 언제든지 연결된 동기화 클라이언트의 변경 세트(동기화된 MongoDB 클러스터의 변경 사항 포함)를 허용하고, 운영 변환 알고리즘을 사용하여 변경 사항을 선형 순서로 직렬화하고 충돌하는 변경 세트를 해결한 후 연결된 클라이언트로 전송합니다.
참고
델타 동기화
동기화된 객체 를 변경하면 App Services 는 전체 객체 를 다시 업로드하지 않습니다. 대신 App Services 는 이전과 이후의 차이('델타')만 전송합니다. 이 서비스는 zlib 을 사용하여 델타를 압축합니다. 압축. 이렇게 하면 네트워크 부하가 줄어들어 모바일 네트워크 조건에서 특히 유용합니다.
운영 혁신
운영 변환 은 두 개의 변경 집합이 있을 때 지정된 변경 집합 중 하나를 다른 변경 집합에 논리적으로 적용하는 것을 나타내는 세 번째 변경 집합을 생성하는 기능입니다. Realm Mobile Sync는 운영 변환을 사용하여 동일한 기본 상태에 적용되는 서로 다른 동기화 클라이언트의 변경 집합 간 충돌을 해결합니다.
Realm은 동기화가 활성화된 경우에도 오프라인 우선 로컬 데이터베이스이므로 모든 장치가 오프라인 쓰기를 수행하고 나중에 네트워크 연결이 다시 설정되면 해당 변경 집합을 업로드할 수 있습니다. 운영 변환 알고리즘은 논리적 서버 시계와 관련하여 '순서가 잘못된' 변경 집합을 정상적으로 처리하여 동기화된 모든 Realm 파일이 변경된 각 객체의 동일한 버전으로 수렴되도록 설계되었습니다.
팁
Realm 변경 세트에 대한 운영 변환은 리베이스 작업 과 유사합니다. Git에서.
클라이언트 파일 식별자
클라이언트 파일 식별자 는 동기화된 클라이언트 Realm 파일과 해당 서버 파일을 고유하게 식별하는 값입니다. 서버는 Realm 파일을 처음 동기화하는 동안 SDK가 클라이언트 파일 식별자를 요청할 때마다 클라이언트 파일 식별자를 생성합니다. 각 식별자는 2^63보다 작은 0이 아닌 부호 있는 64비트 정수입니다.
참고
서버는 특정 서버 파일을 대신하여 생성된 모든 식별자가 서로 간에 고유하도록 보장합니다. 두 클라이언트 파일이 서로 다른 서버 파일과 연결된 경우 서버는 자유롭게 두 파일에 대해 동일한 식별자를 생성할 수 있습니다.
네트워크 보안
SDK는 TLS 을 1.3사용하여 HTTPS로 보호되는 WebSocket 연결을 통해 애플리케이션 서버 와 동기화됩니다.
동기화 세션 프로세스
Realm Mobile Sync 동기화 세션을 시작, 실행 및 종료하기 위해 Realm SDK와 애플리케이션 서버는 일련의 프로토콜별 요청을 보내고 받습니다.
SDK는 HTTP 를 통해 WebSocket 연결을 협상한 다음 WebSocket 연결을 통해 BIND
및 IDENT
요청을 서버 에 전송하여 동기화 세션 을 설정합니다. 세션이 설정되면 SDK와 서버 는 UPLOAD
및 DOWNLOAD
메시지를 통해 지정된 Realm 파일 에 대해 동기화된 변경 세트를 서로 보냅니다. 세션을 종료하기 위해 SDK는 UNBIND
요청 을 보냅니다.
Realm SDK App Server | | | <---- 1. HTTP Handshake -----> | | | | --------- 2. BIND -----------> | | | | <-- 3. IDENT (first time) ---- | | | | --------- 4. IDENT ----------> | | | | <---- 5. UPLOAD/DOWNLOAD ----> | | | | --------- 6. UNBIND ---------> |
클라이언트가 앱 서버에 연결
동기화 프로토콜은 주로 SDK와 서버 간의 WebSocket 연결을 통해 처리됩니다. 연결을 설정하기 위해 SDK는 다음을 포함하는 핸드셰이크 HTTP 요청을 보냅니다.
프로토콜 버전
WebSocket 키
인증된 App Services 애플리케이션 사용자의 유효한 액세스 토큰
서버 는 HTTP 101 전환 프로토콜 을 전송합니다. SDK에 대한 WebSocket 연결을 지정하는 응답입니다. 나머지 동기화 프로토콜 은 이 연결을 통해 발생합니다.
클라이언트가 동기화 세션을 시작함
동기화 세션을 시작하기 위해 Realm SDK는 Device Sync 서버에 BIND
요청을 보냅니다. 요청에는 동기화할 특정 로컬 Realm 데이터베이스 파일을 식별하고 서버가 SDK에 대한 양방향 연결을 여는 데 사용할 WebSocket 연결 키가 포함되어 있습니다.
SDK가 특정 Realm 데이터베이스 파일 을 처음 동기화 하려고 하는 경우, 해당 파일 에 대한 서버 생성 클라이언트 식별자가 아직 존재하지 않습니다. 이 경우 BIND
요청 은 Device Sync 서버 가 할당해야 함도 나타냅니다.
App Services에서 새 클라이언트 파일 식별자 할당
BIND
요청 이 SDK에 클라이언트 파일 식별자가 필요하다는 것을 나타내면 Device Sync 서버 는 지정된 Realm 데이터베이스 파일 에 대한 고유 값을 생성하고 IDENT
응답으로 SDK에 보냅니다. SDK가 IDENT
을(를) 수신하면 새 클라이언트 식별자를 로컬 Realm 데이터베이스 파일 에 영구적으로 저장합니다.
SDK는 각 Realm 데이터베이스 파일을 처음 동기화할 때만 클라이언트 파일 식별자를 요청하면 됩니다. 후속 동기화 세션에서 SDK는 영구 식별자를 사용할 수 있습니다.
클라이언트가 클라이언트 식별자를 전송합니다.
SDK가 BIND
요청 으로 동기화 세션 을 시작하면 동기화 하려는 로컬 Realm 데이터베이스 파일 을 식별해야 합니다. 이를 위해 SDK는 클라이언트 파일 식별자가 포함된 IDENT
메시지를 애플리케이션 서버 에 전송합니다. SDK가 이전에 영역 을 서버 와 동기화한 경우, 가장 최근에 동기화된 서버 버전을 지정하여 동기화 프로세스 를 최적화할 수 있습니다.
IDENT
메시지를 받으면 서버 는 세션을 설정합니다. 이제 SDK와 서버 는 언제든지 업로드 및 다운로드 동기화 변경 세트를 자유롭게 보낼 수 있습니다.
클라이언트 업로드 & 다운로드 동기화 변경 세트
동기화 세션 이 설정되면 SDK와 서버 는 UPLOAD
및 DOWNLOAD
메시지를 자유롭게 보내고 받을 수 있어 변경 사항이 발생할 때마다 동기화 할 수 있습니다.
SDK는 서버 로부터 메시지로 수신한 UPLOAD
변경 집합을 제외하고 적용하는 모든 변경 집합에 DOWNLOAD
대해 메시지를 보냅니다.
서버 가 UPLOAD
메시지를 받으면 운영 변환 을 적용하여 다른 변경 세트와의 충돌을 해결한 다음 변환된 변경 세트를 영역 의 서버 버전에 적용합니다. 이렇게 하면 서버가 서버 영역 을 미러링하는 동기화된 Atlas cluster 를 포함하여 연결된 다른 클라이언트에 DOWNLOAD
메시지를 보내도록 서버 가 트리거됩니다. DOWNLOAD
메시지는 서버 기록에 따라 하나 이상의 변환된 변경 세트를 가장 오래된 것부터 가장 최근의 것까지 시간순으로 그룹화합니다. SDK는 동일한 순서로 변경 세트를 적용합니다.
요청 유형
클라이언트 -> 서버 메시지
다음 표에서는 동기화 클라이언트가 Realm Mobile Sync 서버에 보낼 수 있는 요청 유형을 설명합니다.
요청 | 설명 |
---|---|
서버 에서 새 동기화 세션 을 시작하고 현재 애플리케이션 사용자에게 서명 권한 부여 토큰을 제공합니다. 클라이언트 가 동기화 하려는 Realm 파일 에 대한 클라이언트 파일 식별자 를 아직 가지고 있지 않은 경우, 이는 서버 가 식별자를 생성하여 클라이언트 로 다시 보내야 함을 나타냅니다. 클라이언트는 다른 요청을 전송하기 전에 BIND를 전송해야 합니다. | |
다음을 나타내는 클라이언트 파일 식별자 를 제공합니다.
이 요청 은 클라이언트 가 클라이언트 파일 식별자를 요청할 때 서버 가 전송하는 | |
클라이언트 에서 발생한 작업에 대한 하나 이상의 변경 집합 을 지정합니다. 변경 세트는 클라이언트 버전별로 오름차순으로 나열됩니다. | |
클라이언트에서 발생한 직렬화된 트랜잭션을 설명하는 변경 집합 을 지정합니다. 클라이언트는 서버가 트랜잭션을 확인하거나 거부할 때까지 다른 변경 세트를 업로드할 수 없습니다. | |
실행 중인 동기화 세션을 종료합니다. 클라이언트 는 | |
서버 기록의 최신 변경 집합 을 동기화했을 때(요청 시점에) 서버 가 클라이언트 에게 이를 알리도록 요청 합니다. | |
새 사용자 토큰으로 현재 동기화 세션을 다시 인증합니다. | |
서버 가 하나 이상의 STATE 메시지를 보내도록 요청하며, 클라이언트 는 이 메시지를 사용하여 Realm 파일 의 현재 서버 버전을 다운로드 합니다. 클라이언트는 동기화된 영역 을 비동기적으로 열 때 상태 요청을 실행합니다. | |
클라이언트가 보내고 서버에서 처리한 최신 변경 집합의 클라이언트 버전을 서버로 보내도록 요청합니다. 이는 SDK가 클라이언트 재설정을 실행할 때 가장 일반적으로 사용됩니다. | |
클라이언트가 여전히 연결되어 있으며 서버가 동기화 세션을 유지해야 함을 나타냅니다. 클라이언트는 10 분마다 서버에 하나 이상의 PING을 보내야 합니다. 서버는 서버가 10분 이상 클라이언트로부터 핑을 받지 못하면 클라이언트 연결이 끊어진 것으로 간주하여 세션을 자동으로 종료할 수 있습니다. |
서버 -> 클라이언트 메시지
다음 표에서는 Device Sync 서버가 동기화 클라이언트에 보낼 수 있는 요청 유형을 설명합니다.
요청 | 설명 |
---|---|
식별자를 요청한 에 대한 응답으로 서버가 생성한 클라이언트 파일 식별자 BIND 를 제공합니다. | |
서버 가 UNBIND 에 대한 응답으로 동기화 세션 을 종료하도록 지정합니다. | |
서버 가 클라이언트 의 TRANSACT 에 지정된 변경 집합을 성공적으로 처리했는지 여부를 나타냅니다. | |
서버 가 서버 로부터 클라이언트 받았을 때 서버 기록에 있던 MARK 최신 변경 집합 을 클라이언트 에 전송했음을 나타냅니다. | |
클라이언트가 연결하여 Realm의 최신 서버 버전을 구성할 수 있는 인코딩된 데이터 세그먼트를 하나 이상 포함합니다. STATE_REQUEST 에 대한 응답으로 전송됩니다. | |
클라이언트 가 전송하고 서버 에서 처리한 최신 변경 집합의 클라이언트 버전을 지정합니다. CLIENT_VERSION_REQUEST 에 대한 응답으로 전송됩니다. | |
연결된 클라이언트로 인해 발생한 것으로 보이는 문제가 서버에 발생했음을 나타냅니다. 자세한 내용은 동기화 클라이언트 오류를 참조하세요. | |
PING 을 승인합니다. 클라이언트 클라이언트 현재 네트워크를 통해 서버 와 통신할 수 없으며 서버 가 해당 PING 을 받지 못했을 수 있습니다. |