Overview
Un error de restablecimiento de cliente es un escenario en el que un dominio cliente no puede sincronizar datos con el backend de la aplicación. Los clientes en este estado pueden continuar ejecutándose y guardando datos localmente, pero no pueden enviar ni recibir conjuntos de cambios de sincronización hasta que realicen un restablecimiento de cliente. Los SDK de dominio proporcionan métodos para gestionar automáticamente los restablecimientos de cliente en la mayoría de los casos.
Advertencia
De forma predeterminada, el proceso de restablecimiento del cliente intenta recuperar los cambios no sincronizados que se guardaron correctamente localmente. Cuando la aplicación cliente tiene cambios de esquema importantes, o si El modo de recuperación está deshabilitado en el servidor, el proceso de reinicio del cliente no puede recuperar datos no sincronizados que puedan persistir localmente en el dispositivo.
Los reinicios de clientes ocurren cuando el historial del servidor es incompatible con el del cliente. Las causas más comunes son:
Fallos del servidor de Atlas App Services: Un servidor puede restaurarse desde una copia de seguridad con una versión anterior. En este caso, un restablecimiento del cliente restablecería la versión anterior y perdería los cambios guardados en el cliente pero no sincronizados con el servidor.
Deshabilitar y volver a habilitar la sincronización: desactivar y volver a activar la sincronización en la interfaz de usuario de App Services hace que todos los clientes requieran un reinicio del cliente.
Incompatibilidad de esquemas entre cliente y backend: Si una aplicación cliente intenta sincronizarse con el backend mientras usa un esquema de objeto de dominio que no existe en este, el cliente debe reiniciarlo. Esto solo aplica en una dirección: si el esquema del backend contiene una clase de objeto de dominio que no se usa en un cliente, este no necesita reiniciarlo.
Tiempo máximo sin conexión del cliente: Cuando un cliente no se ha sincronizado con el backend durante más de los días indicados, ya no podrá sincronizar los cambios locales no sincronizados con el backend. El cliente debe descartar todos los cambios locales desde la última sincronización y descargar el estado actual del dominio desde el backend.
Cambios de esquema disruptivos: Un cambio disruptivo o destructivo, como cambiar un tipo de propiedad o una clave principal, requiere que finalice y vuelva a habilitar la sincronización. Esto crea un nuevo archivo de dominio sincronizado con una versión no relacionada con el archivo del cliente. En este caso, el proceso de restablecimiento del cliente no puede completarse automáticamente, y la aplicación debe proporcionar un controlador manual de restablecimiento del cliente.
Actualización de un clúster compartido a uno dedicado: Al actualizar de un clúster compartido a uno dedicado, debe finalizar la sincronización en el clúster anterior. Después de la actualización, puede volver a habilitar la sincronización. Desactivar y volver a activar la sincronización hace que todos los clientes requieran un reinicio.
Cambios en el rol de sesión: Al usar la Sincronización Flexible, los cambios en el rol de sesión de un usuario provocan el restablecimiento del cliente. Los siguientes escenarios provocan el restablecimiento del cliente:
modificaciones del lado del servidor a la función de sesión
cambios en el valor de cualquier expansión en las expresiones "aplicar cuando", leer o escribir
cambios que califican al usuario para un rol de sesión diferente
Nota
Los cambios importantes en el esquema requieren una actualización del esquema de la aplicación
Después de un cambio de esquema importante:
Todos los clientes deben realizar un reinicio manual del cliente.
Debe actualizar los modelos de cliente afectados por el cambio de esquema importante.
Gestionar un restablecimiento de cliente
Los SDK detectan automáticamente la necesidad de reiniciar el cliente. Pueden hacerlo automáticamente en la mayoría de los casos, excepto en caso de un cambio de esquema importante.
Durante un reinicio automático del cliente, el cliente:
Descarga una copia nueva del reino desde el backend.
Realiza una comparación para determinar los pasos necesarios para llevar la copia original (local) del reino al mismo estado que la copia nueva del backend.
Aplica ese conjunto de pasos para transformar el ámbito local en un estado donde pueda sincronizarse con el backend.
Si no hay cambios de esquema, o solo hay cambios de esquema permanentes, el SDK intenta recuperar todos los cambios locales que aún no se han sincronizado con el backend. También aplica las inserciones, actualizaciones y eliminaciones del backend que aún no se han sincronizado con el cliente.
Si ha optado por descartar los cambios no sincronizados en el SDK, o si el modo de recuperación no puede recuperarlos, el SDK puede descartar los cambios locales que aún no se hayan sincronizado con el backend. A continuación, puede aplicar cualquier inserción, actualización o eliminación del backend que aún no se haya sincronizado con el cliente. Para descartar los cambios locales, elija la versión de su SDK preferida.
recoverOrDiscardmodo de reinicio del cliente.Descarta la copia nueva. La aplicación continúa usando la copia original del dominio con la diferencia aplicada.
En caso de un cambio de esquema disruptivo, o si falla el restablecimiento automático del cliente, este se ejecuta mediante un controlador manual de restablecimiento que la aplicación debe definir. Los SDK de Realm no pueden realizar automáticamente un restablecimiento del cliente al realizar un cambio de esquema disruptivo.
El modo de reinicio automático del cliente tiene varias ventajas en comparación con la recuperación manual:
Su aplicación puede reiniciar un cliente sin escribir ninguna lógica personalizada, salvo especificar el modo. No es necesario iniciar manualmente el reinicio ni interactuar con el objeto de error.
Tu aplicación puede reiniciar un cliente sin cerrar ningún dominio, desconectarse de la aplicación backend ni reiniciar manualmente. Esto significa que no necesitas escribir ninguna lógica para gestionar estas situaciones.
Los usuarios de la aplicación reciben notificaciones de cambios a medida que el ámbito local se actualiza para coincidir con el estado del ámbito backend.
Recuperar cambios no sincronizados
Cuando la Recuperación de Cliente está habilitada en la configuración de Sincronización de Dispositivos (como está por defecto), las aplicaciones cliente pueden recuperar automáticamente los cambios no sincronizados. En la mayoría de los casos, la aplicación cliente puede detectar un error de restablecimiento del cliente e iniciar un proceso automatizado para gestionarlo.
Después de reiniciar el cliente, la aplicación puede abrirse y funcionar normalmente.
Recuperación de Cliente puede recuperar datos no sincronizados en los restablecimientos de cliente, excepto si se ha producido un cambio de esquema importante. Recuperación de Cliente aplica las Reglas de Recuperación de Restablecimiento de Cliente al determinar cómo integrar los datos no sincronizados del dispositivo.
Puede optar por descartar cambios no sincronizados si el cliente no puede recuperar los datos no sincronizados. En este caso, se descartan los datos locales, pero el cliente puede restablecerlo automáticamente. Para descartar los cambios locales, seleccione la versión del recoverOrDiscard modo de restablecimiento de cliente de su SDK preferido.
Reglas de recuperación de restablecimiento del cliente
En un restablecimiento de cliente que no implica un cambio de esquema importante, los SDK de Realm intentan recuperar los cambios no sincronizados. El SDK integra objetos creados localmente que no se sincronizaron antes del restablecimiento del cliente. Estas reglas determinan cómo se resuelven los conflictos cuando tanto el backend como el cliente realizan cambios en el mismo objeto:
Si se elimina un objeto en el servidor, pero se modifica en el cliente en recuperación, la eliminación tiene prioridad y el cliente descarta la actualización.
Si se elimina un objeto en el cliente en recuperación, pero no en el servidor, entonces el cliente aplica la instrucción de eliminación.
En el caso de actualizaciones conflictivas en el mismo campo, se aplica la actualización del cliente.
Descartar cambios no sincronizados
Advertencia
Elimina permanentemente los cambios locales no sincronizados
Este modo de restablecimiento de cliente elimina permanentemente cualquier cambio realizado localmente que aún no se haya sincronizado con el backend. No lo use si su aplicación necesita conservar los cambios no sincronizados.
El modo de restablecimiento de cliente para descartar cambios no sincronizados gestiona automáticamente los restablecimientos del cliente sin intentar recuperar los datos del dispositivo cliente. Puede elegir este modo si las reglas de recuperación de restablecimiento del cliente no funcionan en su aplicación o si no necesita guardar los datos no sincronizados. Cuando este modo usa una diferencia para que el dominio local vuelva al mismo estado que el backend, los cambios no sincronizados se eliminan permanentemente.
El modo Descartar cambios no sincronizados no puede realizar un restablecimiento del cliente automatizado en caso de un cambio de esquema importante.
Reinicio manual del cliente
En caso de un cambio de esquema importante, los SDK de Realm no pueden gestionar automáticamente el restablecimiento del cliente. Debe definir un controlador manual de restablecimiento del cliente si realiza cambios de esquema importantes.
En este escenario, un controlador de restablecimiento manual del cliente debería indicar al usuario que actualice la aplicación. En las versiones del SDK de Realm que gestionan automáticamente los restablecimientos del cliente, este solo se produce en situaciones de error donde no se puede lograr una recuperación significativa.
Ejemplos
Para obtener más información sobre cómo realizar un restablecimiento de cliente, consulte los ejemplos de restablecimiento de cliente para su SDK:
Habilitar o deshabilitar el modo de recuperación
El modo de recuperación está habilitado de forma predeterminada en todas las configuraciones de sincronización de dispositivos. Puedes deshabilitarlo o volver a habilitarlo si ya lo habías deshabilitado.
Seleccione el Device Sync Menú en la barra lateral.
Haga clic en el panel Advanced Configuration para mostrar opciones de configuración adicionales.
Haga clic en el botón Enable Client Recovery.
Pulse el botón Save para confirmar los cambios.
Si su aplicación utiliza borradores de implementación, debe implementar su aplicación después de realizar cambios.
Extraiga una copia local de la última versión de su aplicación con el siguiente comando pull:
Halarappservices pull --remote="<Your App ID>" Puede configurar la cantidad de días que el cliente de su aplicación permanecerá fuera de línea con la propiedad
is_recovery_mode_disableden el archivosync/config.jsonde su aplicación:``sync/config.json``{ ... "is_recovery_mode_disabled": false, ... } Implemente la configuración actualizada de la aplicación con el siguiente comando push:
Empujarappservices push --remote="<Your App ID>"