Overview
A client reset error is a scenario where a client realm cannot sync data with the application backend. Clients in this state may continue to run and save data locally but cannot send or receive sync changesets until they perform a client reset. The Realm SDKs provide methods to automatically handle client resets under most scenarios.
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.
Disabling and re-enabling sync: Turning Sync off and then on again in the App Services UI causes all clients to require a client reset.
Client/Backend schema mismatch: If a client application attempts to synchronize with the backend while using a Realm Object schema that does not exist in the backend, that client must perform a client reset. This only applies in one direction: if the backend schema contains an Realm Object class not used in a client, that client does not need to client reset.
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 la sesión: Al utilizar Flexible Sync, los cambios en el rol de sesión Flexible Sync de un usuario resultan en un restablecimiento del cliente. Los siguientes escenarios resultan en un 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
changes that qualify the user for a different session role
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 SDKs detectan automáticamente la necesidad de restablecimiento del cliente. Pueden realizar automáticamente un restablecimiento del cliente en la mayoría de los casos, excepto en el evento de un cambio importante en el esquema.
Durante un restablecimiento 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 realm local a 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:
Tu aplicación puede realizar un restablecimiento del cliente sin escribir ninguna lógica personalizada, aparte de especificar el modo. No es necesario iniciar manualmente el restablecimiento del cliente ni interactuar con el objeto de error en absoluto.
Tu aplicación puede realizar un restablecimiento del cliente sin cerrar ningún reino, desconectarse de la aplicación de backend ni reinicios manuales. Esto significa que no tienes que 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.
Client Reset Recovery Rules
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 recuperando, pero no en el servidor, el cliente aplicará la instrucción de borrado.
En el caso de actualizaciones conflictivas en el mismo campo, se aplica la actualización del cliente.
Descartar cambios no sincronizados
Advertencia
Deletes Unsynced Local Changes Permanently
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.
The discard unsynced changes client reset mode automatically handles client resets without attempting to recover data from the client device. You might choose this mode if the Client Reset Recovery Rules do not work for your app, or if you don't need to save unsynced data. When this mode uses a diff to bring the local realm to the same state as the backend, unsynced changes are permanently deleted.
El modo Descartar cambios no sincronizados no puede realizar un restablecimiento del cliente automatizado en caso de un cambio de esquema importante.
Manual restablecimiento 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 manejador manual de restablecimiento del cliente debería hacer algo como indicar al usuario que actualice la aplicación. En las versiones del SDK de Realm que gestionan automáticamente los restablecimientos del cliente, un restablecimiento manual del cliente sólo ocurre en escenarios de error donde no puede ocurrir una recuperación significativa.
Ejemplos
For more information on performing a client reset, check out the client reset examples for your SDK:
Habilitar o deshabilitar el modo de recuperación
Recovery Mode is enabled by default in every Device Sync configuration. You can disable Recovery Mode, or re-enable it if you have previously disabled it.
Selecciona el Device Sync Menú en la barra lateral.
Haz clic en el panel Advanced Configuration para mostrar opciones de configuración adicionales.
Haz clic en el interruptor Enable Client Recovery.
Presiona el botón Save para confirmar tus cambios.
Si su aplicación utiliza borradores de implementación, debe implementar su aplicación después de realizar cambios.
Pull a local copy of the latest version of your app with the following pull command:
Tirarappservices pull --remote="<Your App ID>" You can configure the number of days for your application's client maximum offline time with the
is_recovery_mode_disabledproperty in your app'ssync/config.jsonfile:``sync/config.json``{ ... "is_recovery_mode_disabled": false, ... } Implemente la configuración actualizada de la aplicación con el siguiente comando push:
Pushappservices push --remote="<Your App ID>"