2009-03-11 13 views
6

Estoy trabajando en la sincronización de dos objetos comerciales entre un iPhone y un sitio web usando una carga útil basada en XML y me encantaría solicitar algunas ideas para una rutina óptima.¿Sincronizar objetos entre dos sistemas dispares, mejor enfoque?

La naturaleza de esta pregunta es bastante genérico y aunque puedo ver que es aplicable a una variedad de diferentes sistemas que necesitan sincronizar los objetos de negocio entre una entidad y un cliente web (escritorio, teléfono móvil, etc.)

Los objetos comerciales se pueden editar, eliminar y actualizar en ambos lados. Ambas partes pueden almacenar el objeto localmente, pero la sincronización solo se inicia en el lado del iPhone para la visualización desconectada. Todos los objetos tienen una marca de tiempo updated_at y created_at y están respaldados por un RDBMS en ambos lados (SQLite en el lado del iPhone y MySQL en la web ... de nuevo, no creo que esto importe mucho) y el teléfono graba la última vez que sincronización fue intentada De lo contrario, no se almacenan otros datos (por el momento).

¿Qué algoritmo usarías para minimizar la vibración de red entre los sistemas para la sincronización? ¿Cómo manejarías las eliminaciones si las "eliminaciones suaves" no son una opción? ¿Qué cambios en el modelo de datos agregarías para facilitar esto?

Respuesta

11

El enfoque más simple: al sincronizar, transfiera todos los registros where updated_at >= @last_sync_at. Abajo: este enfoque no tolera muy bien el sesgo del reloj.

Probablemente sea más seguro mantener una columna de número de versión que se incrementa cada vez que se actualiza una fila (para que el reloj no ensucie el proceso de sincronización) y un último número de versión sincronizado (para que los cambios potencialmente conflictivos puedan ser identificado). Para hacer que este ancho de banda sea eficiente, mantenga un caché en cada base de datos de la última versión enviada a cada par de replicación para que solo se puedan transmitir las filas modificadas. Si esto va a ser una topología en estrella, las hojas pueden usar un esquema simplificado donde la última versión sincronizada se almacena en cada tabla.

Se requiere alguna forma de eliminaciones suaves para admitir la sincronización de eliminaciones, sin embargo, esto puede ser en forma de un registro "piedra sepulcral" que contiene solo la clave de la fila eliminada. Las piedras sepulcrales solo se pueden eliminar de manera segura una vez que estás seguro de que todas las réplicas las han procesado, de lo contrario, es posible que una réplica desparecida resucite un registro que creías que se había eliminado.

+0

Gracias por su colaboración. Creo que el problema que has planteado con respecto al sesgo del tiempo es importante. Mi esperanza inicial es que entre NTP en el servidor y los servicios de sincronización de tiempo del iPhone/Touch con el operador/computadora, se mitiguen los problemas de tiempo. ¿Es esta suposición demasiado peligrosa? – hyuan

+0

Es frágil en muchos sentidos; por ejemplo, un reloj que se restablece al revés también puede causar actualizaciones perdidas, y las actualizaciones perdidas pueden ocasionar conflictos de edición no detectados. La replicación multimaestro es una tarea no trivial. –

+0

Gracias por el amable consejo. Con suerte, en un par de semanas, podrás ver los frutos de tu sabiduría. El sitio en cuestión ya está activo (www.ayenotes.com) pero la aplicación de iPhone no. – hyuan

0

Creo que, en resumen, sus preguntas se relacionan con la sincronización desconectada.

Así que aquí es lo que creo que debería suceder:

sincronización inicial de recuperar los datos y cualquier información asociada a ella (versiones de filas, las sumas de comprobación de archivos, etc.). es importante que almacene esta información y la deje prístina hasta la próxima sincronización exitosa. Los cambios deben hacerse en una COPIA de estos datos.

Cambios de seguimiento Si se trata de filas de bases de datos, la idea es, básicamente, hacer un seguimiento de las operaciones de inserción, actualización y eliminación. Si está tratando con archivos de texto como xml, entonces es un poco más complicado. Si es probable que varios usuarios editen este archivo al mismo tiempo, entonces debería tener una herramienta de diferencias, para que los conflictos se puedan detectar en un nivel más granular (en lugar de todo el archivo).

Comprobación de conflictos De nuevo, si solo se trata de filas de bases de datos, los conflictos son fáciles de detectar. Puede tener otra columna que se incremente cada vez que se actualice la fila (creo que mssql tiene este built-up no está seguro acerca de mysql). Entonces, si la copia que tiene tiene un número diferente al contenido del servidor, entonces tiene un conflicto. Para archivos o cadenas, una suma de comprobación hará el trabajo. Supongo que también podría usar la fecha de modificación, pero asegúrese de tener una medición muy precisa y precisa para evitar errores.por ejemplo: digamos que recupero un archivo y lo guardas tan pronto como lo recupere. Digamos que la diferencia de tiempo es de 1 milisegundo. Luego hago cambios al archivo y luego intento guardarlo. Si la hora de la última modificación registrada tiene una precisión de solo 10 milisegundos, existe una buena posibilidad de que el archivo que recuperé tenga la misma fecha de modificación que la que guardó para que el programa no crea conflicto y sobrescriba los cambios. Por lo tanto, generalmente no uso este método solo para estar seguro. Por otro lado, las posibilidades de una colisión de checksum/hash después de una modificación menor son casi nulas.

Resolviendo conflictos Ahora esta es la parte difícil. Si se trata de un proceso automatizado, deberá evaluar la situación y decidir si desea sobrescribir los cambios, perder los cambios o recuperar los datos del servidor nuevamente e intentar rehacer los cambios. Afortunadamente para ti, parece que habrá interacción humana. Pero todavía le cuesta mucho codificar. Si está trabajando con filas de bases de datos, puede verificar cada columna individual y compararla con los datos en el servidor y presentarla al usuario. La idea es presentar conflictos al usuario de una manera muy granular para no abrumarlos. La mayoría de los conflictos tienen diferencias muy pequeñas en muchos lugares diferentes, por lo que se presentan al usuario una pequeña diferencia a la vez. Entonces, para los archivos de texto, es casi lo mismo pero más cien veces más complicado. Entonces, básicamente, tendría que crear o usar una herramienta de diferencias (la comparación de texto es un tema completamente diferente y es demasiado amplio para mencionarlo aquí) que le permite conocer los pequeños cambios en el archivo y dónde están de una manera similar a la de un archivo. base de datos: donde se insertó, borró o editó el texto. Luego, presente eso al usuario de la misma manera. así que, básicamente, para cada conflicto pequeño, el usuario debería elegir si desea descartar sus cambios, sobrescribir los cambios en el servidor o realizar una edición manual antes de enviarlos al servidor.

Así que si ha hecho las cosas bien, al usuario se le debe dar una lista de conflictos si los hay. Estos conflictos deben ser lo suficientemente detallados para que el usuario pueda decidir rápidamente. Entonces, por ejemplo, el conflicto es un cambio de ortografía, sería más fácil para el usuario elegir la ortografía de las palabras en contraste con darle al usuario todo el párrafo y decirle que hubo un cambio y que tienen que decidir qué hacer , el usuario tendría que buscar este pequeño error ortográfico.

Otras consideraciones: Validación de datos: tenga en cuenta que debe realizar la validación después de resolver los conflictos ya que los datos pueden haber cambiado Comparación de texto: como dije, este es un tema importante. así que google! Sincronización desconectada: creo que hay algunos artículos por ahí.

Fuente: https://softwareengineering.stackexchange.com/questions/94634/synchronization-web-service-methodologies-or-papers

Cuestiones relacionadas