Menu Docs
Página inicial do Docs
/ /
Serviços Atlas App
/ /

Atlas Device Sync Protocol

Nesta página

  • Visão geral
  • Conceitos chave
  • Conjunto de alterações
  • transformação operacional
  • Identificador de arquivo do cliente
  • Segurança de rede
  • Processo da sessão de sincronização
  • O cliente se conecta ao servidor de aplicativos
  • O cliente inicia uma sessão de sincronização
  • O App Services aloca um novo identificador de arquivo do cliente
  • O cliente envia um identificador do cliente
  • Uploads e downloads do cliente sincronizar conjuntos de alterações
  • O cliente encerra a sessão de sincronização
  • Tipos de solicitação
  • Cliente -> Mensagens do servidor
  • servidor -> Mensagens do cliente

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 detipos de solicitação de predefinidos, bem como um processo pelo qual um cliente, como um Realm SDK , pode se conectar a um servidor de aplicação do 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 App Services não recarrega o objeto inteiro. Em vez disso, o 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 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 IDENT enviada pelo servidor quando um cliente solicita um identificador de arquivo do cliente .

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 STATE , que o cliente usa para baixar a versão atual do servidor do Arquivo de 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 um PONG.

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 BIND que solicitou o identificador.
DOWNLOAD

Especifica um ou mais conjuntos de alterações (até 16MB no 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 um UNBIND.
TRANSACT
Indica se o servidor processou com êxito ou não um changeset especificado em um TRANSACT do 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 domínio. Enviado em resposta a um STATE_REQUEST.
CLIENT_VERSION
Especifica a versão do cliente do último changeset que foi enviado pelo cliente e processado pelo servidor. Enviado em resposta a um CLIENT_VERSION_REQUEST.
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.

Voltar

Resolução de conflitos