Overview
Nuevo en la versión 10.17.0.
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.
Estrategias de restablecimiento de clientes
Los escenarios de reinicio de cliente ocurren cuando el historial del servidor es incompatible con el del cliente. Las causas más comunes de reinicio de cliente se describen en Restablecimientos de cliente.
En el SDK de .NET, puede especificar una estrategia de restablecimiento de cliente en FlexibleSyncConfiguration y PartitionSyncConfiguration. La propiedad ClientResetHandler puede configurarse con uno de los siguientes valores:
Entrenador de animales | Estrategia | notas |
|---|---|---|
RecoverOrDiscardUnsyncedChangesHandler (Predeterminado) | Recuperar todos los cambios locales no sincronizados | Si falla la recuperación, este controlador recurre al |
Recuperar todos los cambios locales no sincronizados | Si la recuperación falla, este controlador recurre a | |
Descartar cambios no sincronizados | Esta estrategia elimina de forma permanente todos los cambios locales no sincronizados realizados desde la última sincronización exitosa. | |
Recuperación manual | Le proporciona una manera de implementar su propia estrategia de recuperación. |
Las siguientes secciones describen las diferentes estrategias para manejar un restablecimiento de cliente y cómo puede utilizar cada uno de los ClientResetHandlers.
Recuperar cambios locales no sincronizados
En un restablecimiento de cliente que no implique un cambio de esquema importante, el SDK integra objetos creados localmente que no se sincronizaron antes del restablecimiento del cliente. Las siguientes 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.
Importante
Cambios radicales
El proceso de recuperación no puede gestionar un cambio de esquema radical. Por ejemplo, si realizas un cambio no aditivo en una o más de tus clases de objetos Realm, el proceso de recuperación fallará. En este caso, los usuarios deberán actualizar su aplicación cliente. Para obtener más información sobre los cambios disruptivos, consulta Referencia rápida de cambios disruptivos frente a cambios no disruptivos.
Hay dos controladores de restablecimiento de cliente que intentan recuperar automáticamente los datos locales no sincronizados: RecoverOrDiscardUnsyncedChangesHandler y RecoverUnsyncedChangesHandler.
RecoverOrDiscardUnsyncedChangesHandler
Este es el controlador predeterminado, ya que proporciona el proceso de recuperación más robusto. Si el proceso de recuperación automática falla, se recurre a la DiscardLocalReset estrategia, explicada en la sección "Descartar cambios no sincronizados". Si dicho proceso falla, se recurre a una estrategia de restablecimiento manual, explicada en la sección "Recuperación manual". Este controlador proporciona los siguientes métodos de devolución de llamada:
OnBeforeReset, que el SDK invoca antes del reinicio del cliente. Puede usar esta devolución de llamada para notificar al usuario antes de que comience el reinicio del cliente.
OnAfterRecovery, que el SDK invoca solo si el restablecimiento automático se completa correctamente. Puede usarlo para notificar al usuario que el restablecimiento del cliente se ha completado.
OnAfterDiscard, que el SDK invoca solo si falla el restablecimiento automático del cliente y la estrategia local de descarte tiene éxito. Si la estrategia de descarte falla, no se invoca esta devolución de llamada.
ManualResetFallback, que el SDK invoca solo si la recuperación automática y la estrategia de descarte fallan. Esta devolución de llamada se implementa para gestionar el fallo de restablecimiento. La lógica aquí debería ser similar a la descrita para un ManualRecoveryHandler.
El siguiente ejemplo muestra el uso de cada una de estas devoluciones de llamada:
var conf = new FlexibleSyncConfiguration(user) { ClientResetHandler = new RecoverOrDiscardUnsyncedChangesHandler { // The following callbacks are optional OnBeforeReset = (beforeReset) => { // Executed before the client reset begins // Can be used to notify the user that a reset is going // to happen }, OnAfterRecovery = (beforeReset, afterReset) => { // Executed after the client reset is complete // Can be used to notify the user that the reset is done }, OnAfterDiscard = (beforeReset, afterReset) => { // Executed if the automatic recovery has failed // but the DiscardUnsyncedChanges fallback has completed // successfully }, ManualResetFallback = (err) => { // Automatic reset failed; handle the reset manually here } } };
Recuperar el controlador de cambios no sincronizados
Al igual que, este controlador intenta recuperar automáticamente todos los cambios locales no sincronizados. Sin embargo, a diferencia RecoverOrDiscardUnsyncedChangesHandler RecoverOrDiscardUnsyncedChangesHandler de, este controlador no DiscardUnsyncedChangesHandler recurre a si la recuperación automática falla. En su lugar, recurre a una estrategia de restablecimiento manual que se explica en la sección "Recuperación manual". El controlador proporciona los siguientes métodos de devolución de llamada:
OnBeforeReset, que puede utilizar para notificar al usuario antes de que comience el reinicio.
OnAfterReset, que puede utilizar para notificar al usuario cuando el restablecimiento se haya completado correctamente.
ManualResetFallback, que se implementa para gestionar un error de restablecimiento. La lógica aquí debería ser similar a la descrita para ManualRecoveryHandler.
El siguiente ejemplo muestra el uso de cada una de estas devoluciones de llamada:
var conf = new FlexibleSyncConfiguration(user) { ClientResetHandler = new RecoverUnsyncedChangesHandler { // The following callbacks are optional OnBeforeReset = (beforeReset) => { // Executed before the client reset begins // Can be used to notify the user that a reset is going // to happen }, OnAfterReset = (beforeReset, afterReset) => { // Executed after the client reset is complete // Can be used to notify the user that the reset is done }, ManualResetFallback = (err) => { // Automatic reset failed; handle the reset manually here } } };
Descartar cambios no sincronizados
Esta estrategia elimina permanentemente todos los cambios locales no sincronizados realizados desde la última sincronización exitosa. Si elige usar DiscardUnsyncedChangesHandler un, el SDK restaura el archivo de dominio local a un estado sincronizable sin cerrar el dominio y manteniendo las notificaciones funcionando correctamente. Si este proceso falla, se recurre a una estrategia de restablecimiento manual que se explica en la sección "Recuperación manual". Este controlador proporciona los siguientes métodos de devolución de llamada:
OnBeforeReset, que el SDK invoca antes del reinicio del cliente. Puede usar esta devolución de llamada para notificar al usuario antes de que comience el reinicio.
OnAfterReset, que el SDK invoca solo si el restablecimiento se completa correctamente. Puede usarlo para notificar al usuario cuando se complete el restablecimiento.
ManualResetFallback, que el SDK invoca si la restauración falla. La lógica aquí debe ser similar a la descrita para un ManualRecoveryHandler.
El siguiente ejemplo muestra cómo se podría implementar un DiscardUnsyncedChangesHandler:
{
var config = new FlexibleSyncConfiguration(user);
config.ClientResetHandler = new DiscardUnsyncedChangesHandler()
{
// The following callbacks are optional
OnBeforeReset = (beforeReset) =>
{ // Executed before the client reset begins // Can be used to notify the user that a reset is going // to happen },
OnAfterReset = (beforeReset, afterReset) => { // Executed after the client reset is complete // Can be used to notify the user that the reset is done },
ManualResetFallback = (err) =>
{ // Automatic reset failed; handle the reset manually here }
};
try {
var realm = await Realm.GetInstanceAsync(config); }
catch (Exception ex) { Console.WriteLine($@"Error creating or opening the realm file. {ex.Message}"); }
Recuperación manual
En la mayoría de los casos, debería usar una de las otras estrategias para restablecer clientes. Para los casos poco frecuentes en los que necesite personalizar el proceso de recuperación de datos, seleccione el controlador ManualRecoveryHandler.
Nota
Respaldos
Aunque la estrategia manual solo debería utilizarse en casos extremos, los otros controladores de restablecimiento de cliente podrían recurrir a una estrategia manual. La lógica que se utiliza en dichos controladores es similar a la lógica descripta aquí.
Dentro ManualRecoveryHandler de, elimina el reino existente y luego llama al método InitiateClientReset().
El siguiente ejemplo demuestra la implementación de ManualRecoveryHandler:
private void SetupRealm()
{
var config = new FlexibleSyncConfiguration(user);
config.ClientResetHandler =
new ManualRecoveryHandler(HandleClientResetError);
var realm = await Realm.GetInstanceAsync(config);
}
private void HandleClientResetError(ClientResetException clientResetException)
{
Console.WriteLine($"Client Reset requested: {clientResetException.Message}");
// Prompt user to perform a client reset immediately. If they don't,
// they won't receive any data from the server until they restart the app
// and all changes they make will be discarded when the app restarts.
var didUserConfirmReset = ShowUserAConfirmationDialog();
if (didUserConfirmReset)
{
// Close the Realm before doing the reset. It must be
// deleted as part of the reset.
fsRealm.Dispose();
// perform the client reset
var didReset = clientResetException.InitiateClientReset();
if (didReset)
{
// Navigate the user back to the main page or reopen the
// the Realm and reinitialize the current page
}
else
{
// Reset failed - notify user that they'll need to
// update the app
}
}
}
Manejo del restablecimiento del cliente de prueba
Puede probar manualmente el manejo de restablecimiento del cliente de su aplicación finalizando y volviendo a habilitar la sincronización del dispositivo.
Al finalizar y reactivar Sync, los clientes que se conectaron previamente con Sync no podrán hacerlo hasta que restablezcan el cliente. Al finalizar Sync, se eliminan los metadatos del servidor que permiten la sincronización. El cliente debe descargar una nueva copia del dominio desde el servidor. El servidor envía un error de restablecimiento de cliente a estos clientes. Por lo tanto, al finalizar Sync, se activa la condición de restablecimiento de cliente.
Para probar el manejo del restablecimiento del cliente:
Escriba datos desde una aplicación cliente y espere a que se sincronicen.
Termina y vuelve a habilitar Device Sync.
Ejecute la aplicación cliente nuevamente. La aplicación debería mostrar un error de restablecimiento de cliente al intentar conectarse al servidor.
Advertencia
Mientras itera sobre la gestión del restablecimiento de clientes en su aplicación cliente, es posible que tenga que finalizar y volver a habilitar la sincronización repetidamente. Esto impide que todos los clientes existentes puedan sincronizar hasta después de completar un restablecimiento. Para evitar esto en producción, pruebe la gestión del restablecimiento de clientes en un entorno de desarrollo.