Overview
New in version 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.
Client Reset Strategies
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, puedes especificar una estrategia de restablecimiento del cliente en tu FlexibleSyncConfiguration y PartitionSyncConfiguration. La propiedad ClientResetHandler se puede configurar en una de las siguientes opciones:
Handler | Strategy | notas |
|---|---|---|
RecoverOrDiscardUnsyncedChangesHandler (Default) | Recover all unsynced local changes | Si falla la recuperación, este controlador recurre al |
Recover all unsynced local changes | Si la recuperación falla, este controlador recurre a | |
Discard unsynced changes | Esta estrategia borra todos los cambios locales no sincronizados realizados desde la última sincronización exitosa. | |
Manual recovery | Te proporciona una forma de implementar tu 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.
Recover Unsynced Local Changes
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 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.
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.
There are two client reset handlers that try to automatically recover the unsycned local data: RecoverOrDiscardUnsyncedChangesHandler and 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, which the SDK invokes prior to the client reset. You can use this callback to notify the user before the client reset begins.
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.
The following example shows using each of these callbacks:
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 } } };
RecoverUnsyncedChangesHandler
Like the RecoverOrDiscardUnsyncedChangesHandler, this handler attempts to recover all unsynced local changes automatically. However, unlike RecoverOrDiscardUnsyncedChangesHandler, this handler does not fall back to a DiscardUnsyncedChangesHandler if the automatic recovery fails. Instead, it falls back to a manual reset strategy explained in the Manual Recovery section. The handler provides the following callback methods:
OnBeforeReset, que puede utilizar para notificar al usuario antes de que comience el reinicio.
OnAfterReset, which you can use to notify the user when the reset has completed successfully.
ManualResetFallback, que se implementa para gestionar una falla de restablecimiento. La lógica aquí debería ser similar a la descrita para un Manejador de recuperación manual.
The following example shows using each of these callbacks:
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, which the SDK invokes prior to the client reset. You can use this callback to notify the user before the reset begins.
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.
The following example shows how you might implement a 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}"); }
Manual Recovery
In most cases, you should use one of the other strategies for client resets. For those infrequent cases where you need to customize your data recovery process, select the ManualRecoveryHandler handler.
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í.
Within the ManualRecoveryHandler, you dispose the existing realm, and then call the InitiateClientReset() method.
The following example demonstrates implementing the 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
}
}
}
Test Client Reset Handling
Puede probar manualmente el manejo de restablecimiento del cliente de su aplicación finalizando y volviendo a habilitar la sincronización del dispositivo.
When you terminate and re-enable Sync, clients that have previously connected with Sync are unable to connect until after they perform a client reset. Terminating Sync deletes the metadata from the server that allows the client to synchronize. The client must download a new copy of the realm from the server. The server sends a client reset error to these clients. So, when you terminate Sync, you trigger the client reset condition.
To test client reset handling:
Write data from a client application and wait for it to synchronize.
Termina y vuelve a habilitar Device Sync.
Ejecuta la aplicación cliente nuevamente. La aplicación debería obtener un error de restablecimiento del cliente cuando intente 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.