Lo primero que debe decidir es una política general sobre qué lado se considera "autorizado" en caso de cambios contradictorios.
Es decir: supongamos que el registro # 125 se cambia en el servidor el 5 de enero a las 10 p.m. y el mismo registro se cambia en uno de los teléfonos (llamémoslo Cliente A) el 5 de enero a las 11 p.m. La última sincronización fue el 3 de enero. Luego, el usuario se vuelve a conectar, digamos, el 8 de enero.
Identificar lo que debe cambiarse es "fácil" en el sentido de que tanto el cliente como el servidor conocen la fecha de la última sincronización, por lo que cualquier cosa creada o actualizada (ver más abajo para más información sobre esto) desde la última sincronización debe reconciliarse.
Entonces, suponga que el único registro modificado es el # 125. O decide que uno de los dos "gana" automáticamente y sobrescribe al otro, o necesita admitir una fase de conciliación en la que un usuario puede decidir qué versión (servidor o cliente) es la correcta, sobrescribiendo la otra.
Esta decisión es sumamente importante y debes ponderar el "rol" de los clientes. Especialmente si hay un conflicto potencial no solo entre el cliente y el servidor, sino en caso de que diferentes clientes puedan cambiar los mismos registros.
[Suponiendo que # 125 puede ser modificado por un segundo cliente (Cliente B), existe la posibilidad de que el Cliente B, que aún no se ha sincronizado, proporcione otra versión del mismo registro, haciendo que la resolución de conflictos anterior sea discutible]
Con respecto al punto " creado o actualizado " anterior ... ¿cómo puede identificar correctamente un registro si se originó en uno de los clientes (asumiendo que esto tiene sentido en el dominio de su problema)? Supongamos que su aplicación administra una lista de contactos comerciales. Si el cliente A dice que tiene que agregar un John Smith recién creado y el servidor tiene un John Smith creado ayer por el cliente D ... ¿crea dos registros porque no puede estar seguro de que no sean personas diferentes? ¿Le pedirá al usuario que también concilie este conflicto?
¿Los clientes tienen "propiedad" de un subconjunto de datos? Es decir, si el Cliente B está configurado para ser la "autoridad" sobre los datos del Área # 5, ¿el Cliente A puede modificar / crear registros para el Área # 5 o no? (Esto facilitaría la resolución de conflictos, pero puede resultar inviable para su situación).
En resumen, los principales problemas son:
- Cómo definir la "identidad" teniendo en cuenta que es posible que los clientes separados no hayan accedido al servidor antes de crear un nuevo registro.
- La situación anterior, sin importar cuán sofisticada sea la solución, puede resultar en la duplicación de datos, por lo que debe prever cómo resolverlos periódicamente y cómo informar a los clientes que lo que ellos consideraron como "Registro # 675" en realidad se ha fusionado o reemplazado por Registro # 543
- Decidir si los conflictos serán resueltos por Fiat (por ejemplo, "La versión de servidor siempre triunfa sobre el cliente de si el primero ha sido actualizado desde la última sincronización") o mediante la intervención manual
- En el caso de fiat , especialmente si decide que el cliente tiene prioridad, también debe ocuparse de cómo tratar con otros clientes aún no sincronizados que pueden tener algunos cambios más en camino.
- Los elementos anteriores no tienen en cuenta la granularidad de sus datos (para simplificar la descripción). Baste decir que en lugar de razonar en el nivel de "Registro", como en mi ejemplo, puede que le resulte más apropiado registrar el cambio en el nivel de campo. O trabajar en un conjunto de registros (por ejemplo, registro de persona + registro de dirección + registro de contactos) a la vez, tratando su agregado como una especie de "meta registro".
Bibliografía:
Más sobre esto, por supuesto, en Wikipedia .
Un algoritmo de sincronización simple del autor de Vdirsyncer
Artículo de OBJC sobre sincronización de datos
SyncML®: Sincronización y administración de sus datos móviles (Reserve en O'Reilly Safari)
Tipos de datos replicados sin conflictos
Replicación optimista YASUSHI SAITO (HP Laboratories) y MARC SHAPIRO (Microsoft Research Ltd.) - Encuestas de computación de ACM, vol. V, No. N, 3 2005.
Alexander Traud, Juergen Nagler-Ihlein, Frank Kargl y Michael Weber. 2008. Sincronización cíclica de datos mediante la reutilización de SyncML. En Actas de la Novena Conferencia Internacional sobre Gestión de Datos Móviles (MDM '08). IEEE Computer Society, Washington, DC, EE. UU., 165-172. DOI = 10.1109 / MDM.2008.10 http://dx.doi.org/10.1109/MDM.2008.10
Lam, F., Lam, N. y Wong, R. 2002. Sincronización eficiente para datos XML móviles. En Actas de la undécima conferencia internacional sobre gestión de la información y el conocimiento (McLean, Virginia, EE.UU., 4 al 9 de noviembre de 2002). CIKM '02. ACM, Nueva York, NY, 153-160. DOI = http://doi.acm.org/10.1145/584792.584820
Cunha, PR y Maibaum, TS 1981. Resource & equil; tipo de datos abstracto + sincronización - Una metodología para la programación orientada a mensajes -. En Actas de la Quinta Conferencia Internacional sobre Ingeniería de Software (San Diego, California, Estados Unidos, 9 al 12 de marzo de 1981). Congreso Internacional de Ingeniería de Software. IEEE Press, Piscataway, Nueva Jersey, 263-272.
(Los últimos tres son de la biblioteca digital de ACM, no tengo idea de si es miembro o si puede obtenerlos a través de otros canales).
Desde el sitio de Dr.Dobbs :
- Creación de aplicaciones con SQL Server CE y SQL RDA por Bill Wagner 19 de mayo de 2004 (Mejores prácticas para diseñar una aplicación tanto para PC de escritorio como para PC móvil - Windows / .NET)
De arxiv.org:
- Un tipo de datos JSON replicado libre de conflictos : el documento describe una implementación de JSON CRDT (los tipos de datos replicados libres de conflictos, CRDT, son una familia de estructuras de datos que admiten modificaciones simultáneas y que garantizan la convergencia de dichas actualizaciones simultáneas).