Los conflictos surgen cuando dos o más usuarios realizan cambios en los mismos datos de forma independiente. Esto puede deberse a la latencia entre el dispositivo y el servidor o a la pérdida de conectividad. En este caso, Atlas Device Sync utiliza automáticamente estrategias de resolución de conflictos para fusionar los cambios. En concreto, Device Sync gestiona la resolución de conflictos mediante Transformación operativa: un conjunto de reglas que garantizan una sólida consistencia final, lo que significa que todas las versiones de los clientes convergerán a estados idénticos. Esto se mantendrá incluso si los cambios se realizaron en un orden diferente.
Debes conocer las reglas para garantizar resultados consistentes, pero la ventaja es que al seguirlas puedes hacer que los dispositivos funcionen completamente sin conexión y aun así converjan en resultados significativos cuando se encuentran.
Esta página utiliza el ejemplo de una aplicación para pasear perros para ilustrar cómo Device Sync resuelve conflictos. En esta aplicación, Matt y Sarah son paseadores de perros que la usan para rastrear los perros de sus clientes y sus horarios de paseo.
Reglas de resolución de conflictos
A muy alto nivel, las reglas son las siguientes:
- Las eliminaciones siempre ganan.
- Si un lado elimina un objeto, éste permanecerá eliminado siempre, incluso si el otro lado le ha realizado cambios posteriormente.
- La última actualización gana.
- Si dos lados actualizan la misma propiedad, Device Sync mantendrá el valor de la actualización más reciente.
- Las inserciones en listas se ordenan por tiempo.
- Si se insertan dos elementos en la misma posición, el primero aparecerá antes que el otro. Esto significa que, si ambos lados añaden elementos al final de una lista, se incluirán ambos elementos en orden de inserción.
- Las claves primarias designan la identidad del objeto.
- Si dos partes crean objetos de la misma clase con claves primarias idénticas, se tratarán como instancias del mismo objeto.
Ejemplo
Resolución de conflictos entre dos usuarios
Matt y Sarah trabajan con datos para su negocio de paseo de perros. Matt borra los datos de Doug, uno de los perros de su cliente, porque ya no necesitan pasearlo. Mientras Sarah está fuera sin conexión a internet, edita los datos de tiempo de paseo requeridos de Doug en su versión local sin conexión, ya que desconoce que Matt los ha borrado.
Una vez que Sarah recupere la conexión a internet, su cambio se enviará al servidor. El servidor le enviará la operación de eliminación de Matt. Dado que las eliminaciones siempre prevalecen según las reglas de resolución de conflictos de Device Sync, se conserva la eliminación de Matt en lugar de la edición de Sarah. El servidor no enviará las ediciones de Sarah al dispositivo de Matt. Los datos coinciden nuevamente en los dispositivos de Matt y Sarah.
Consideraciones especiales
Contadores
El uso de números enteros para contar es un caso especial. La forma en que la mayoría de los lenguajes de programación implementarían una operación de incremento (como v
+= 1) consiste en leer el valor, incrementar el resultado y luego almacenarlo. Obviamente, esto no funcionará si varias partes realizan el incremento simultáneamente (pueden leer 10, incrementarlo a 11 y, al fusionarlo, obtener un resultado de 11 en lugar del 12 deseado).
Para respaldar este caso común, ofrecemos una forma de indicar si se incrementa (o disminuye) el valor, proporcionando suficientes pistas para que la fusión alcance el resultado correcto. Tiene la opción de actualizar el valor completo o editarlo para que tenga más significado, lo que le permite un control más preciso de la resolución de conflictos.
Colecciones anidadas
Las colecciones anidadas se tratan de forma similar a los objetos incrustados. Es decir, se consideran objetos secundarios con un objeto primario específico. Cualquier actualización del objeto primario siempre prevalecerá en la resolución de un conflicto, incluso si sobrescribe al objeto secundario.
Las actualizaciones de una colección anidada se resuelven de la siguiente manera:
Si varios dispositivos actualizan la misma colección anidada existente, Device Sync utiliza reglas normales de resolución de conflictos para incorporar ambos cambios.
Si varios dispositivos crean nuevas colecciones únicas anidadas en el mismo objeto principal, se aplica la regla "la última actualización prevalece" y Device Sync sobrescribe todas las demás actualizaciones con la última actualización realizada.
Por ejemplo, los datos del cliente en la aplicación para pasear perros de Sarah y Matt se modelan como matrices anidadas en la propiedad principal client. Sarah, y posteriormente Matt, crean cada uno una nueva colección de detalles para el mismo cliente en sus dispositivos sin conexión. Cuando los dispositivos se sincronizan, Device Sync conserva la entrada creada por Matt, ya que su actualización (creación de una nueva colección de detalles anidada) fue la última realizada.
Posteriormente, Sarah y Matt realizan actualizaciones únicas a la entrada de detalles recién creada. Device Sync combinará estas actualizaciones según las reglas habituales de resolución de conflictos, insertando los elementos nuevos o modificados en la lista en orden cronológico.
Instrumentos de cuerda
Device Sync interpreta el valor de una string en su totalidad y no fusiona conflictos a nivel de carácter individual. Por ejemplo, esto significa que si se inserta o elimina un caracter o subcadena dentro de un string, Device Sync tratará esto como un reemplazo de todo el valor del string.
Diccionarios
Device Sync considera la eliminación de una clave de diccionario como una actualización, no como una eliminación. Por lo tanto, se aplica la regla "La última actualización prevalece" en lugar de la regla "Las eliminaciones siempre prevalecen".
Por ejemplo, la aplicación para pasear perros contiene una colección opcional de detalles de cada perro, que se introducen como valores clave. Mientras ambos usuarios están desconectados, Sarah elimina la entrada favorite toy de un perro y, posteriormente, Matt actualiza el juguete favorito de ese perro a tennis ball. Cuando ambos vuelven a conectarse, Device Sync considera ambas actualizaciones de la entrada favorite toy y aplica las de Matt, ya que las realizó después de que Sarah eliminara la cuenta.
Resolución de conflictos personalizada
En general, la resolución de conflictos de Device Sync debería funcionar en la mayoría de los casos y no debería ser necesario personalizarla. Dicho esto, la forma típica de personalizar la resolución de conflictos es cambiar el tipo de propiedad de cadena a lista. Cada parte puede añadir sus actualizaciones a la lista y aplicar las reglas de resolución de conflictos que desee directamente en el modelo de datos. Puede usar esta técnica para implementar valores máximos, mínimos, victorias de primera escritura, victorias de última escritura o cualquier otro tipo de resolución que se le ocurra.
Resumen
Device Sync implementa un sistema de resolución de conflictos que permite que varios escritores fuera de línea escriban simultáneamente y, aun así, converjan en el mismo resultado.
- El sistema de resolución de conflictos sigue cuatro reglas:
Las eliminaciones siempre ganan.
La última actualización gana.
Las inserciones en listas se ordenan por tiempo.
Las claves primarias designan la identidad del objeto.
Los contadores, las colecciones anidadas y las cadenas son casos especiales que se deben tener en cuenta en el código del cliente.