ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Menu Docs

Atlas Device Sync Protocol

O Atlas Device Sync usa um protocolo para sincronizar correta e eficientemente as alteraƧƵes de dados em tempo real em vĆ”rios clientes, cada um mantendo seus prĆ³prios arquivos Realm locais. O protocolo define um conjunto de tipos de solicitaĆ§Ć£o predefinidos, bem como um processo pelo qual um cliente, como um Realm SDK, pode se conectar a um servidor de aplicativos Atlas App Services e sincronizar dados.

ObservaĆ§Ć£o

Os SDKs do Realm implementam e managed internamente o protocolo de sincronizaĆ§Ć£o; portanto, para a maioria das aplicaĆ§Ć£o, vocĆŖ nĆ£o precisa entender o protocolo de sincronizaĆ§Ć£o para usar o Realm Mobile Sync. Esta pĆ”gina abrange o protocolo em um alto nĆ­vel e nĆ£o Ć© uma especificaĆ§Ć£o de implementaĆ§Ć£o.

Um changeset Ć© uma lista de instruƧƵes que descrevem modificaƧƵes granulares feitas em um estado ou versĆ£o de objeto conhecido por uma ou mais operaƧƵes de gravaĆ§Ć£o. Os conjuntos de alteraƧƵes sĆ£o a unidade base do protocolo de sincronizaĆ§Ć£o. Os clientes do Realm sincronizados enviam conjuntos de alteraƧƵes para o servidor Realm Mobile Sync sempre que executam uma operaĆ§Ć£o de gravaĆ§Ć£o. O servidor envia a cada cliente conectado os conjuntos de alteraƧƵes para operaƧƵes de gravaĆ§Ć£o executadas por outros clientes.

O servidor do Realm Mobile Sync aceita conjuntos de alteraƧƵes de qualquer cliente de sincronizaĆ§Ć£o conectado (incluindo alteraƧƵes em um cluster MongoDB sincronizado) a qualquer momento e usa um algoritmo de transformaĆ§Ć£o operacional para serializar as alteraƧƵes em uma ordem linear e resolver conjuntos de alteraƧƵes conflitantes antes de enviĆ”-los aos clientes conectados.

ObservaĆ§Ć£o

SincronizaĆ§Ć£o do delta

Quando vocĆŖ faz uma alteraĆ§Ć£o em um objeto sincronizado, o Atlas App Services nĆ£o recarrega o objeto inteiro. Em vez disso, o Atlas App Services envia apenas a diferenƧa ("delta") entre antes e depois. O serviƧo comprime os deltas com zlib compressĆ£o. Isso reduz a carga da rede, o que Ć© especialmente Ćŗtil em condiƧƵes de rede mĆ³vel.

Uma transformaĆ§Ć£o operacional Ć© uma funĆ§Ć£o que, dado dois conjuntos de alteraƧƵes, produz um terceiro conjunto de alteraƧƵes que representa a aplicaĆ§Ć£o lĆ³gica de um dos conjuntos de alteraƧƵes fornecidos apĆ³s o outro. O Device Sync usa transformaĆ§Ć£o operacional para resolver conflitos entre conjuntos de alteraƧƵes de diferentes clientes de sincronizaĆ§Ć£o que se aplicam ao mesmo estado base.

O Realm Ć© um banco de dados local offline, mesmo quando a sincronizaĆ§Ć£o estĆ” ativada, o que significa que qualquer dispositivo pode realizar gravaƧƵes offline e carregar os conjuntos de alteraƧƵes correspondentes mais tarde, quando a conectividade de rede for restabelecida. O algoritmo de transformaĆ§Ć£o operacional foi projetado para lidar normalmente com conjuntos de alteraƧƵes que chegam "fora de ordem" em relaĆ§Ć£o ao relĆ³gio lĆ³gico do servidor, de modo que cada arquivo Realm sincronizado converja para a mesma versĆ£o de cada objeto alterado.

Dica

Uma transformaĆ§Ć£o operacional em conjuntos de alteraƧƵes de Realm Ć© anĆ”loga a uma operaĆ§Ć£o de rebase em Git.

Um identificador de Arquivo de Realm do cliente Ć© um valor que identifica exclusivamente um Arquivo de Realm do cliente sincronizado e seu arquivo de servidor correspondente. O servidor gera um identificador de arquivo do cliente sempre que um SDK solicita um durante a sincronizaĆ§Ć£o inicial de um Arquivo de Realm. Cada identificador Ć© um nĆŗmero inteiro assinado positivo de 64 bits, estritamente menor que 2^63.

ObservaĆ§Ć£o

O servidor garante que todos os identificadores gerados em nome de um arquivo de servidor especĆ­fico sejam exclusivos entre si. O servidor Ć© livre para gerar identificadores idĆŖnticos para dois arquivos de clientes se eles estiverem associados a arquivos de servidor diferentes.

O SDK sincroniza com o servidor de aplicaĆ§Ć£o por meio de uma conexĆ£o WebSocket protegida por HTTPS usando TLS 1.3.

Para iniciar, executar e encerrar uma sessĆ£o de sincronizaĆ§Ć£o do Realm Mobile Sync, um Realm SDK e um servidor de aplicaĆ§Ć£o enviam e recebem um conjunto de solicitaƧƵes especĆ­ficas do protocolo.

O SDK negociar uma conexĆ£o WebSocket por HTTP e entĆ£o estabelecer uma sessĆ£o de sincronizaĆ§Ć£o enviando solicitaƧƵes do BIND e IDENT para o servidor pela conexĆ£o do WebSocket. Depois que a sessĆ£o Ć© estabelecida, o SDK e o servidor enviam conjuntos de alteraƧƵes sincronizados para um determinado Arquivo de Realm entre si por meio de mensagens UPLOAD e DOWNLOAD . Para encerrar a sessĆ£o, o SDK envia uma solicitaĆ§Ć£o UNBIND .

Realm SDK App Server
| |
| <---- 1. HTTP Handshake -----> |
| |
| --------- 2. BIND -----------> |
| |
| <-- 3. IDENT (first time) ---- |
| |
| --------- 4. IDENT ----------> |
| |
| <---- 5. UPLOAD/DOWNLOAD ----> |
| |
| --------- 6. UNBIND ---------> |
1

O protocolo de sincronizaĆ§Ć£o Ć© tratado principalmente por meio de uma conexĆ£o WebSocket entre o SDK e o servidor. Para estabelecer uma conexĆ£o, o SDK envia uma solicitaĆ§Ć£o HTTP de handshake que inclui o seguinte:

  • uma versĆ£o de protocolo

  • uma chave WebSocket

  • um token de acesso vĆ”lido para um usuĆ”rio autenticado do aplicativo App Services

O servidor envia um protocolo de comutaĆ§Ć£o HTTP 101 que especifica uma conexĆ£o WebSocket para o SDK. O restante do protocolo de sincronizaĆ§Ć£o ocorre por essa conexĆ£o.

2

Para iniciar uma sessĆ£o de sincronizaĆ§Ć£o, um Realm SDK envia uma solicitaĆ§Ć£o do BIND para um servidor do Device Sync. A solicitaĆ§Ć£o identifica um arquivo local especĆ­fico do Banco de Dados Realm para sincronizar e inclui uma chave de conexĆ£o WebSocket que o servidor usarĆ” para abrir uma conexĆ£o bidirecional com o SDK.

Se o SDK estiver tentando sincronizar um arquivo especĆ­fico do Realm Database pela primeira vez, ele ainda nĆ£o possui um identificador de cliente gerado pelo servidor para o arquivo. Nesse caso, a solicitaĆ§Ć£o BIND tambĆ©m indica que o servidor do Device Sync deve alocar um.

3

Se uma solicitaĆ§Ć£o BIND indicar que o SDK precisa de um identificador de arquivo do cliente , o servidor Device Sync gerarĆ” um valor exclusivo para o arquivo do Realm Database especificado e o enviarĆ” para o SDK em uma resposta IDENT . Quando o SDK recebe o IDENT, ele armazena o novo identificador de cliente persistentemente no arquivo de banco de dados Realm local.

Um SDK sĆ³ precisa solicitar um identificador de arquivo do cliente na primeira vez que sincroniza cada reconhecimento de data center Realm. Para sessƵes de sincronizaĆ§Ć£o subsequentes, o SDK pode usar o identificador persistente.

4

Depois que um SDK iniciar uma sessĆ£o de sincronizaĆ§Ć£o com uma solicitaĆ§Ć£o BIND , ele deve identificar o arquivo local do banco de dados Realm que deseja sincronizar. Para isso, o SDK envia ao servidor de aplicaĆ§Ć£o uma mensagem IDENT que contĆ©m o identificador de arquivo do cliente . Se o SDK tiver sincronizado anteriormente o Realm com o servidor, ele poderĆ” especificar a versĆ£o do servidor sincronizado mais recentemente para otimizar o processo de sincronizaĆ§Ć£o.

Ao receber a mensagem IDENT , o servidor estabelece a sessĆ£o. O SDK e o servidor agora podem enviar livremente conjuntos de alteraƧƵes de sincronizaĆ§Ć£o de upload e download a qualquer momento.

5

Depois que uma sessĆ£o de sincronizaĆ§Ć£o Ć© estabelecida, o SDK e o servidor podem enviar e receber livremente mensagens UPLOAD e DOWNLOAD para sincronizar as alteraƧƵes sempre que elas ocorrerem.

O SDK envia uma mensagem UPLOAD para cada conjunto de alteraƧƵes aplicado, exceto para aqueles que recebeu em uma mensagem DOWNLOAD do servidor.

Quando o servidor recebe uma mensagem UPLOAD , ele aplica transformaƧƵes operacionais para resolver quaisquer conflitos com outros conjuntos de alteraƧƵes e, em seguida, aplica o conjunto de alteraƧƵes transformado Ć  versĆ£o do servidor do Realm. Isso aciona o servidor para enviar mensagens DOWNLOAD para outros clientes conectados, incluindo o cluster Atlas sincronizado que espelha o Realm do servidor . Uma mensagem DOWNLOAD agrupa um ou mais conjuntos de alteraƧƵes transformados em ordem cronolĆ³gica do mais antigo para o mais recente, de acordo com o histĆ³rico do servidor. O SDK aplica os conjuntos de alteraƧƵes na mesma ordem.

6

Depois que uma sessĆ£o de sincronizaĆ§Ć£o for estabelecida, os servidores do Device Sync continuarĆ£o a aceitar UPLOAD mensagens e enviar DOWNLOAD mensagens atĆ© que o SDK encerre a sessĆ£o. Para encerrar uma sessĆ£o de sincronizaĆ§Ć£o , um SDK envia uma solicitaĆ§Ć£o UNBIND para o servidor Device Sync .

A tabela a seguir descreve os tipos de solicitaĆ§Ć£o que um cliente de sincronizaĆ§Ć£o pode enviar para um servidor do Device Sync:

Solicitar
DescriĆ§Ć£o
BIND

Inicia uma nova sessĆ£o de sincronizaĆ§Ć£o no servidor e fornece um token de autorizaĆ§Ć£o assinado para o usuĆ”rio atual do aplicaĆ§Ć£o . Se o cliente ainda nĆ£o possuir um identificador de arquivo do cliente para o Arquivo de Realm que deseja sincronizar, isso tambĆ©m indica que o servidor deve gerar um e enviĆ”-lo de volta ao cliente.

Um cliente deve enviar um BIND antes de enviar qualquer outra solicitaĆ§Ć£o.

IDENT

Fornece o identificador do arquivo do cliente que indica o seguinte:

  • o arquivo Realm a ser sincronizado

  • a versĆ£o atual do realm do cliente

  • a versĆ£o de servidor sincronizada mais recentemente do cliente

Essa solicitaĆ§Ć£o estĆ” relacionada, mas distinta da mensagem enviada pelo servidor quando um cliente solicita um identificador de arquivo do cliente IDENT .

UPLOAD

Especifica um ou mais conjuntos de alteraƧƵes para operaƧƵes que ocorreram no cliente. Os conjuntos de alteraƧƵes sĆ£o listados por versĆ£o do cliente em ordem crescente.

TRANSACT

Especifica um changeset que descreve uma transaĆ§Ć£o serializada que ocorreu no cliente. O cliente nĆ£o pode carregar nenhum outro conjunto de alteraƧƵes atĆ© que o servidor confirme ou rejeite a transaĆ§Ć£o.

UNBIND

Termina uma sessĆ£o de sincronizaĆ§Ć£o em execuĆ§Ć£o.

Um cliente nĆ£o pode enviar quaisquer outros pedidos para uma sessĆ£o UNBOUND .

MARK

Solicita que o servidor notifique o cliente quando sincronizar o conjunto de alteraƧƵes mais recente no histĆ³rico do servidor (no momento da solicitaĆ§Ć£o).

REFRESH

Reautoriza uma sessĆ£o de sincronizaĆ§Ć£o atual com um novo token de usuĆ”rio.

STATE_REQUEST

Solicita que o servidor envie uma ou mais mensagens, que o cliente usa para baixar a versĆ£o atual do servidor do Arquivo de STATE Realm. Os clientes emitem solicitaƧƵes de estado quando abrem de forma assĆ­ncrona um Realm sincronizado.

CLIENT_VERSION_REQUEST

Solicita que o servidor envie a versĆ£o do cliente do Ćŗltimo conjunto de alteraƧƵes que foi enviado pelo cliente e processado pelo servidor. Isso Ć© mais comumente usado quando um SDK executa uma redefiniĆ§Ć£o de cliente.

PING

Indica que o cliente ainda estĆ” conectado e que o servidor deve manter a sessĆ£o de sincronizaĆ§Ć£o. Um cliente deve enviar pelo menos um PING para o servidor a cada 10 minutos. O servidor reconhece cada PING com PONG um.

Se o servidor nĆ£o receber um ping de um cliente em mais de 10 minutos, ele considerarĆ” que o cliente foi desconectado e poderĆ” encerrar automaticamente a sessĆ£o.

A tabela a seguir descreve os tipos de solicitaĆ§Ć£o que o servidor do Realm Mobile Sync pode enviar para um cliente de sincronizaĆ§Ć£o:

Solicitar
DescriĆ§Ć£o
IDENT

Fornece um identificador de arquivo do cliente que o servidor gerou em resposta a um que solicitou o BIND identificador.

DOWNLOAD

Especifica um ou mais conjuntos de alteraƧƵes (atĆ© 16MB total) para operaƧƵes que ocorreram em outros clientes. Os conjuntos de alteraƧƵes sĆ£o listados por versĆ£o do servidor em ordem crescente.

Os conjuntos de alteraƧƵes em um DOWNLOAD podem nĆ£o ser os conjuntos de alteraƧƵes exatos carregados por outros clientes. Em vez disso, eles podem ser conjuntos de alteraƧƵes equivalentes gerados pelo algoritmo de transformaĆ§Ć£o operacional do Device Sync.

UNBOUND

Especifica que o servidor encerrou uma sessĆ£o de sincronizaĆ§Ć£o em resposta a UNBIND um.

TRANSACT

Indica se o servidor processou com ĆŖxito ou nĆ£o um changeset especificado em um do TRANSACT cliente.

MARK

Indica que o servidor enviou ao cliente o Ćŗltimo changeset que estava no histĆ³rico do servidor quando o servidor recebeu um MARK do cliente.

STATE

ContĆ©m um ou mais segmentos de dados codificados que o cliente pode concatenar para construir a versĆ£o de servidor mais recente do Realm. Enviado em resposta a STATE_REQUEST um.

CLIENT_VERSION

Especifica a versĆ£o do cliente do Ćŗltimo changeset que foi enviado pelo cliente e processado pelo servidor. Enviado em resposta a CLIENT_VERSION_REQUEST um.

ERROR

Indica que o servidor encontrou um problema que parece ter sido causado pelo cliente conectado. Para obter detalhes, consulte Erros do cliente de sincronizaĆ§Ć£o.

PONG

Reconhece um PING. Se um cliente nĆ£o receber uma confirmaĆ§Ć£o de PING, isso indicarĆ” que o cliente nĆ£o pode se comunicar atualmente com o servidor pela rede e que o servidor pode nĆ£o ter recebido o PING correspondente.