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
Visão geral
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.
Conceitos chave
Conjunto de alterações
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.
transformação operacional
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.
Identificador de arquivo do cliente
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.
Segurança de rede
O SDK sincroniza com o servidor de aplicação por meio de uma conexão WebSocket protegida por HTTPS usando TLS 1.3.
Processo da sessão de sincronização
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 ---------> |
O cliente se conecta ao servidor de aplicativos
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.
O cliente inicia uma sessão de sincronização
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.
O App Services aloca um novo identificador de arquivo do cliente
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.
O cliente envia um identificador do cliente
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.
Uploads e downloads do cliente sincronizar conjuntos de alterações
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.
O cliente encerra a sessão de sincronização
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 .
Tipos de solicitação
Cliente -> Mensagens do servidor
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 |
---|---|
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. | |
Fornece o identificador do arquivo do cliente que indica o seguinte:
Essa solicitação está relacionada, mas distinta da mensagem | |
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. | |
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. | |
Termina uma sessão de sincronização em execução. Um cliente não pode enviar quaisquer outros pedidos para uma sessão | |
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). | |
Reautoriza uma sessão de sincronização atual com um novo token de usuário. | |
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. | |
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. | |
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 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. |
servidor -> Mensagens do cliente
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 |
---|---|
Fornece um identificador de arquivo do cliente que o servidor gerou em resposta a um BIND que solicitou o identificador. | |
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. | |
Especifica que o servidor encerrou uma sessão de sincronização em resposta a um UNBIND . | |
Indica se o servidor processou com êxito ou não um changeset especificado em um TRANSACT do cliente. | |
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 . | |
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 . | |
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. | |
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. |