Sincronización con sistema fuera de línea

9

Estoy diseñando un sistema desde el cual sincronizaré datos comerciales desde el dispositivo móvil (que tiene una aplicación integrada) que genera datos y los envía de vuelta al servidor. Cada línea sincronizada genera un registro de negocios específico en la base de datos.

Si lo que sincronizo genera datos con una fecha (dentro de los datos de sincronización) inferior a la fecha de la última modificación de mis datos comerciales, debo ignorarlos y simplemente agregar la base de datos de inicio de sesión. Una vez que se procesan los datos cargados, los datos se obtienen de la base de datos y se descargan al dispositivo.

Debido a esta descarga justo después de escribir, la sincronización debe ser sincrónica. Todavía es posible tener un patrón de lector / escritor si algo como esto vale lo suficiente como para reemplazar mi solución existente. Lo más importante es poder descargar datos actualizados. Esa información se obtiene como un todo, no hay diferencia implementada en este momento (puede llegar más tarde, pero eso no será un problema).

Es posible que tenga varias sincronizaciones en el mismo objeto comercial en ejecución, es poco probable pero puede suceder y prefiero poder manejarlo. Se espera que la sincronización dure algunos segundos pero no algunos minutos, a menos que use la aplicación móvil incorporada sin resincronización durante algunos días.

No se espera que el volumen de datos sincronizados sea grande, ni el proceso de sincronización.

Así que termino usando una exclusión mutua en mi método de sincronización, más precisamente, estoy usando Java y puse un método de escritura sincronizado, no todo el proceso de sincronización, para no bloquear la sincronización de solo lectura.

Me gustaría saber :

  1. Si esto tiene sentido? Mientras el volumen y el tiempo del proceso de sincronización sigan siendo aceptables.
  2. De manera general, qué conceptos debo mirar. Bonificación: si hay alguna implementación de estos conceptos en un módulo Spring.
Walfrat
fuente
¿Qué causa la desconexión? Quiero decir, cuando el dispositivo está fuera de línea, ¿significa que no tiene acceso solo al servidor o tampoco a Internet?
Laiv
No tiene acceso a internet. O no a menudo.
Walfrat
Si tiene múltiples clientes / servidores sincronizados, primero debe decidir sobre el dominio de los datos en caso de que algo difiera. Si considera solo conexiones intermitentes y varios clientes, definitivamente no hay forma de hacerlo de forma incremental.
tofro
El dominio de datos de @tofro es fácil de determinar en mi caso, por lo que no es un problema. Sin embargo, ¿por qué no sería posible hacerlo de forma incremental con conexiones intermitentes? ¿No debería poder usar una última fecha de sincronización? El único problema en mi caso al usar esa fecha sería cómo saber que los datos que están actualmente en mi dispositivo se han movido y deberían eliminarse en el dispositivo.
Walfrat
Según su descripción, he entendido que el mismo elemento de datos se puede cambiar en el servidor o en uno o más clientes múltiples. ¿Cómo sincronizaría en tres direcciones un elemento de datos que fue al móvil n. ° 1, luego fue cambiado en el servidor, luego fue al móvil n. ° 2 y fue cambiado allí, luego el móvil n. ° 1 se conecta (con un móvil desconectado n. ° 2)?
tofro

Respuestas:

1

Un enfoque que he estado investigando durante un tiempo ahora (con cierto éxito) para sincronizar los datos del cliente con los datos del servidor, sin depender de fechas (que podrían no ser confiables) o solicitudes sincrónicas, es una combinación de parches JSON (quizás POJO s en su caso) y fuente de eventos .

La idea básica es que, en lugar de almacenar el estado actual en el cliente y el servidor, el cliente y el servidor almacenan una lista de cambios y se envían mensajes a través de eventos o solicitudes de parches.

Entonces, en lugar de que el cliente envíe todos los datos más una fecha al servidor, el cliente envía un evento, junto con un número de revisión que corresponde a la última vez que el cliente cree que los datos se han actualizado. Algo como esto:

Server.send("MODIFY FOO", 3);

Una vez que el servidor obtiene este evento (asincrónicamente), lo reconcilia con otros eventos que ya haya recibido. Por ejemplo, es posible que otro cliente que trabaje con los mismos datos ya haya modificado algunas cosas, y ahora el número de revisión en el servidor es 5. Por lo tanto, esta revisión deberá aplicarse antes de que se aplicaran los últimos 2, y todos Los clientes deberán ser notificados de este cambio.

Una vez que el servidor finaliza, notifica a todos los clientes interesados ​​los cambios realizados y el nuevo número de revisión actual. Luego, el cliente aplica estos cambios y actualiza su número de revisión interna.

Su kilometraje puede variar, pero espero que ayude.

Editar: otro nombre para este enfoque, o una variación del mismo, se llama cola de mensajes , como se menciona en esta pregunta relacionada .

Jeffrey Sweeney
fuente
El sistema puede estar fuera de línea (sin acceso al servidor) durante algunos días y debe registrar la fecha en que ocurrió el evento, no cuando el evento se sincronizó con el servidor. Por eso tengo que usar fechas. También tengo un número de revisión para optimisticLocking, pero por la misma razón, 2 dispositivos pueden descargar la versión X de un POJO y, cuando se sincronizan más tarde, cada uno envía eventos que deben generar una versión X + 1 y X + 2. Y los dispositivos no pueden comunicarse entre sí.
Walfrat
El número de revisión en esta respuesta siempre se genera en el servidor, el cliente envía números de revisión antiguos, no necesita saber acerca de otros clientes ya que el incremento de la revisión no es su responsabilidad. Esta respuesta no menciona la resolución de conflictos, que es la parte más importante de la solución propuesta.
Basilevs
0

El primer problema es usar fechas como una forma de sincronizar datos. Estoy realmente seguro de que no obtuve todos los detalles de su solución, pero diría que:

  1. ¿Se generan las fechas en los móviles? En este caso, ¿está seguro de que la aplicación que se ejecuta en los móviles siempre usará las fechas correctas? ¿Qué pasa con un usuario malicioso que de alguna manera puede cambiar la fecha del sistema en su dispositivo móvil? ¿Qué pasa con los usuarios en diferentes zonas horarias? Como @jeffrey te dijo, tal vez no sea el mejor enfoque confiar en las fechas generadas en los dispositivos.

  2. Si lo entendí correctamente, utiliza el Control de concurrencia optimista . No veo nada intrínsecamente incorrecto en su enfoque.

  3. Esta pregunta trata sobre la implementación del bloqueo optimista en primavera . Tal vez puedas encontrar algo de inspiración en él.

danidemi
fuente
Necesito registrar la fecha en que se ejecutó la acción, como tal, estoy atascado con la fecha del móvil. La fecha móvil se vuelve a sincronizar con frecuencia con el sistema. Solo los dispositivos registrados pueden sincronizarse con el servidor. En cuanto a la seguridad, queda otra preocupación por ahora (autenticación de dispositivo X509, ...)
Walfrat
La fecha podría registrarse como otro campo de datos más, sin necesidad de tratarlo como token de sincronización.
Basilevs