Overview
Atlas Device Sync utiliza un protocolo para sincronizar de forma correcta y eficiente los cambios de datos en tiempo real entre varios clientes, cada uno de los cuales mantiene sus propios archivos de dominio locales. El protocolo define un conjunto de valores predefinidos. tipos de solicitud, así como un proceso mediante el cual un cliente, como un SDK de Realm, puede conectarse a un servidor de aplicaciones de Atlas App Services y sincronizar datos.
Nota
Los SDK de Realm implementan y gestionan internamente el protocolo de sincronización, por lo que, en la mayoría de las aplicaciones, no es necesario comprenderlo para usar Device Sync. Esta página describe el protocolo a grandes rasgos y no constituye una especificación de implementación.
Conceptos clave
Changeset
A changeset is a list of instructions that describe granular modifications made to a known object state or version by one or more write operations. Changesets are the base unit of the sync protocol. Synced realm clients send changesets to the Device Sync server whenever they perform a write operation. The server sends each connected client the changesets for write operations executed by other clients.
El servidor de sincronización de dispositivos acepta conjuntos de cambios de cualquier cliente de sincronización conectado (incluidos los cambios en un clúster MongoDB sincronizado) en cualquier momento y utiliza un algoritmo de transformación operativa para serializar los cambios en un orden lineal y resolver conjuntos de cambios conflictivos antes de enviarlos a los clientes conectados.
Nota
Delta Sync
Al realizar un cambio en un objeto sincronizado, App Services no vuelve a cargar el objeto completo. En su lugar, envía solo la diferencia ("delta") entre el antes y el después. El servicio comprime los deltas con zlib. compresión. Esto reduce la carga de la red, lo que es especialmente útil en condiciones de red móvil.
Operational Transformation
Una transformación operativa es una función que, dadas dos conjuntos de cambios, produce un tercer conjunto de cambios que representa lógicamente la aplicación de uno de los conjuntos de cambios dados después del otro. Device Sync utiliza transformación operacional para resolver conflictos entre conjuntos de cambios de diferentes clientes de sincronización que se aplican al mismo estado base.
Realm es una base de datos local "off-line first" incluso cuando la sincronización está habilitada, lo que significa que cualquier dispositivo puede realizar escrituras sin conexión y subir los conjuntos de cambios correspondientes más adelante cuando se restablezca la conectividad de red. El algoritmo de transformación operativa está diseñado para gestionar de forma fluida los conjuntos de cambios que llegan «fuera de orden» respecto al reloj lógico del servidor, de modo que todos los archivos Realm sincronizados convergen a la misma versión de cada objeto modificado.
Tip
Una transformación operativa en los conjuntos de cambios de Realm es análoga a una operación de rebase en Git.
Identificador de archivo de cliente
Un identificador de archivo del cliente es un valor que identifica de forma única un archivo Realm de cliente sincronizado y su correspondiente archivo en el servidor. El servidor genera un identificador de archivo de cliente cada vez que una SDK lo solicita durante su sincronización inicial de un archivo Realm. Cada identificador es un entero firmado positivo no nulo de 64 bits estrictamente menor que 2^63.
Nota
El servidor garantiza que todos los identificadores generados para un archivo de servidor específico sean únicos entre sí. El servidor puede generar identificadores idénticos para dos archivos de cliente si están asociados a archivos de servidor diferentes.
Seguridad de red
El SDK se sincroniza con el servidor de aplicaciones a través de una conexión WebSocket protegida por HTTPS usando TLS.1.3
Proceso de sincronización de sesión
Para iniciar, ejecutar y finalizar una sesión de sincronización de dispositivos, un SDK de Realm y un servidor de aplicaciones envían y reciben un conjunto de solicitudes específicas del protocolo.
El SDK negocia una conexión WebSocket a través de HTTP y luego establece una sesión de sincronización enviando Las solicitudes BINDyIDENTse envían al servidor a través de la conexión WebSocket. Una vez establecida la sesión, el SDK y el servidor se envían conjuntos de cambios sincronizados para un archivo de Realm determinado mediante mensajesUPLOADyDOWNLOAD. Para finalizar la sesión, el SDK envía una solicitudUNBIND.
Realm SDK App Server | | | <---- 1. HTTP Handshake -----> | | | | --------- 2. BIND -----------> | | | | <-- 3. IDENT (first time) ---- | | | | --------- 4. IDENT ----------> | | | | <---- 5. UPLOAD/DOWNLOAD ----> | | | | --------- 6. UNBIND ---------> |
El cliente se conecta al servidor de aplicaciones
El protocolo de sincronización se maneja principalmente a través de una conexión WebSocket entre el SDK y el servidor. Para establecer una conexión, el SDK envía una solicitud HTTP de saludo que incluye lo siguiente:
una versión del protocolo
una clave WebSocket
un token de acceso válido para un usuario autenticado de la aplicación App Services
El servidor envía una respuesta HTTP 101 Switching protocolos que especifica una conexión WebSocket para el SDK. El resto del protocolo de sincronización se desarrolla a través de esta conexión.
El cliente inicia una sesión de sincronización
Para iniciar una sesión de sincronización, un SDK de Realm envía una solicitud BIND a un servidor Device Sync. La solicitud identifica un archivo específico de base de datos local Realm a sincronizar e incluye una clave de conexión WebSocket que el servidor usará para abrir una conexión bidireccional con el SDK.
Si el SDK intenta sincronizar un archivo de base de datos Realm específico por primera vez, aún no cuenta con un identificador de cliente generado por el servidor para el archivo. En este caso, la solicitud BIND también indica que el servidor de Device Sync debe asignar uno.
Servicios de aplicaciones asigna un nuevo identificador de archivo de cliente
If a BIND request indicates that the SDK needs a client file identifier, the Device Sync server generates a unique value for the specified Realm Database file and sends it to the SDK in an IDENT response. When the SDK receives the IDENT, it stores the new client identifier persistently in the local Realm Database file.
An SDK only needs to request a client file identifier the first time it syncs each Realm Database file. For subsequent sync sessions, the SDK can use the persisted identifier.
Client Sends a Client Identifier
Una vez que un SDK inicia una sesión de sincronización con una solicitud, debe BIND IDENT identificar el archivo de la base de datos de dominio local que desea sincronizar. Para ello, el SDK envía al servidor de aplicaciones un mensaje que contiene el identificador del archivo del cliente. Si el SDK ya ha sincronizado el dominio con el servidor, puede especificar la versión del servidor sincronizada más reciente para optimizar el proceso de sincronización.
Cuando recibe el mensaje IDENT, el servidor establece la sesión. El SDK y el servidor ahora pueden enviar libremente conjuntos de cambios de sincronización de subida y descarga en cualquier momento.
Sincronización de conjuntos de cambios de cargas y descargas de clientes
Una vez establecida una sesión de sincronización, el SDK y el servidor pueden enviar y recibir libremente mensajes UPLOAD y DOWNLOAD para sincronizar los cambios cuando sea necesario.
The SDK sends an UPLOAD message for every changeset it applies except for those that it received in a DOWNLOAD message from the server.
Cuando el servidor recibe un mensaje,UPLOAD aplica transformaciones operativas para resolver cualquier conflicto con otros conjuntos de cambios y, a continuación, aplica el conjunto de cambios transformado a la versión del servidor del dominio. Esto activa el servidor para enviar mensajes a otros clientes conectados, incluido el clúster DOWNLOAD DOWNLOAD Atlas sincronizado que refleja el dominio del servidor. Un mensaje agrupa uno o más conjuntos de cambios transformados en orden cronológico, del más antiguo al más reciente, según el historial del servidor. El SDK aplica los conjuntos de cambios en el mismo orden.
El cliente finaliza la sesión de sincronización
Una vez establecida una sesión de sincronización, los servidores de sincronización de dispositivos seguirán aceptando mensajes UPLOAD y enviando mensajes hasta que el SDK la finalice. Para DOWNLOAD UNBIND finalizar una sesión de sincronización, un SDK envía una solicitud al servidor de sincronización de dispositivos.
Tipos de solicitud
Mensajes de cliente -> servidor
La siguiente tabla describe los tipos de solicitud que un cliente de sincronización puede enviar a un servidor de sincronización de dispositivos:
Solicitud | Descripción |
|---|---|
Inicia una nueva sesión de sincronización en el servidor y proporciona un token de autorización firmado para el usuario actual de la aplicación. Si el cliente aún no posee un identificador de archivo de cliente para el archivo de Realm que desea sincronizar, esto también indica que el servidor debe generar uno y enviárselo. Un cliente debe enviar un BIND antes de poder enviar cualquier otra solicitud. | |
Proporciona el identificador de archivo del cliente que indica lo siguiente:
Esta solicitud está relacionada con el mensaje que envía el servidor cuando un cliente solicita un identificador de archivo de | |
Especifica uno o más conjuntos de cambios para las operaciones realizadas en el cliente. Los conjuntos de cambios se enumeran por versión del cliente en orden ascendente. | |
Ends a running sync session. Un cliente no puede enviar ninguna otra solicitud para una | |
Vuelve a autorizar una sesión de sincronización actual con un nuevo token de usuario. | |
Solicita que el servidor envíe uno o más mensajes | |
Requests that the server send the client version of the latest changeset that was sent by the client and processed by the server. This is most commonly used when an SDK executes a client reset. | |
Indica que el cliente sigue conectado y que el servidor debe mantener la sesión sincronizada. Un cliente debe enviar al menos un ping al servidor cada 10 minutos. El servidor confirma cada ping con Si el servidor no ha recibido un PING de un cliente en más de 10 minutos, considera que el cliente está desconectado y puede finalizar la sesión automáticamente. |
Servidor -> Mensajes del cliente
La siguiente tabla describe los tipos de solicitud que el servidor de sincronización de dispositivos puede enviar a un cliente de sincronización:
Solicitud | Descripción |
|---|---|
Proporciona un identificador de archivo de cliente que el servidor generó en respuesta a un | |
Especifica uno o más conjuntos de cambios (hasta 16MB en total) para operaciones realizadas en otros clientes. Los conjuntos de cambios se enumeran por versión del servidor en orden ascendente. Los conjuntos de cambios en una DESCARGA pueden no ser exactamente los mismos que subieron otros clientes. En cambio, pueden ser conjuntos de cambios equivalentes generados por el algoritmo de transformación operativa de Device Sync. | |
Especifica que el servidor finalizó una sesión de sincronización en respuesta a | |
Indica si el servidor procesó con éxito o no un conjunto de cambios especificado en un del | |
Indica que el servidor ha enviado al cliente el último conjunto de cambios que estaba en el historial del servidor cuando el servidor recibió un | |
Contiene uno o más segmentos de datos codificados que el cliente puede concatenar para construir la última versión del servidor del dominio. Se envía en respuesta a | |
Especifica la versión del cliente del último conjunto de cambios enviado por el cliente y procesado por el servidor. Se envía en respuesta a | |
Indica que el servidor encontró un problema que parece haber sido causado por el cliente conectado. Para obtener más detalles, consulta Errores del cliente de sincronización. | |
Confirma un. Si un cliente no recibe una confirmación de PING, indica que no puede comunicarse con el servidor a través de la red y que es posible que el servidor no haya recibido |