Sincronizzazione con il sistema offline


9

Sto progettando un sistema dal quale sincronizzerò i dati aziendali dal dispositivo mobile (che ha un'applicazione incorporata) che genera i dati e li rimanda al server. Ogni riga sincronizzata genera un registro aziendale specifico nel database.

Se ciò che sincronizzo genera dati con una data (all'interno dei dati di sincronizzazione) inferiore all'ultima data di modifica dei miei dati aziendali, devo ignorarli e aggiungere semplicemente il database di accesso. Una volta elaborati i dati caricati, i dati vengono recuperati dal database e scaricati sul dispositivo.

A causa di questo download subito dopo la scrittura, la sincronizzazione deve essere sincrona. È ancora possibile avere un modello di lettore / scrittore se qualcosa del genere vale abbastanza per sostituire la mia soluzione esistente. La cosa più importante è poter scaricare dati aggiornati. Che i dati vengano recuperati nel loro insieme, non ci sono differenze implementate al momento (potrebbe venire dopo, ma non sarà un problema).

Potrei avere più sincronizzazioni sullo stesso oggetto business in esecuzione, è improbabile ma può accadere e preferisco essere in grado di gestirlo. La sincronizzazione dovrebbe durare per alcuni secondi ma non per alcuni minuti, a meno che non si utilizzi l'applicazione mobile incorporata senza risincronizzazione per alcuni giorni.

Il volume dei dati sincronizzati non dovrebbe essere grande, né il processo di sincronizzazione.

Quindi finisco per usare una mutua esclusione sul mio metodo di sincronizzazione, più precisamente, sto usando Java e ho messo un metodo di scrittura sincronizzato e non l'intero processo di sincronizzazione per non bloccare la sincronizzazione di sola lettura.

Mi piacerebbe sapere :

  1. Se in questo modo ha senso? Fino a quando il volume e il tempo del processo di sincronizzazione sono ancora accettabili.
  2. In generale, quali concetti dovrei guardare. Bonus: se c'è una implementazione di questi concetti in un modulo Spring.

Cosa causa la offline? Voglio dire quando il dispositivo è offline significa che non ha accesso solo al server o nemmeno a Internet?
Laiv

Non ha accesso a Internet. O non spesso.
Walfrat,

Se hai più client / server che eseguono la sincronizzazione, devi prima decidere il master dei dati nel caso in cui qualcosa differisca. Se si considerano solo connessioni intermittenti e più client, sicuramente non c'è modo di farlo in modo incrementale.
Tofro

Nel mio caso, @tofro Data Mastership è facile da determinare, quindi non è un problema. Tuttavia, perché non sarebbe possibile farlo in modo incrementale con connessioni intermittenti? Non dovrei essere in grado di utilizzare solo l'ultima data di sincronizzazione? L'unico problema nel mio caso usando una data del genere sarebbe come sapere che i dati che sono attualmente sul mio dispositivo sono stati spostati e dovrebbero essere eliminati sul dispositivo.
Walfrat,

Dalla tua descrizione, ho capito che lo stesso elemento di dati può essere modificato sul server o su uno o più client multipli. Come sincronizzeresti in tre modi un elemento di dati che è andato al cellulare n. 1, quindi è stato modificato sul server, quindi è andato al cellulare n. 2 ed è stato modificato lì, quindi il cellulare n. 1 si connette (con un cellulare n. 2 disconnesso)?
Tofro

Risposte:


1

Un approccio che ho indagato per un po 'ora (con un certo successo) per avere i dati client di sincronizzazione con i dati del server, senza fare affidamento su date (che potrebbe essere inaffidabile) o richieste sincrone, è una combinazione di JSON patch (forse POJO s nel tuo caso) e l' approvvigionamento di eventi .

L'idea di base è che invece di memorizzare lo stato corrente sul client e sul server, il client e il server memorizzano un elenco di modifiche e si scambiano messaggi attraverso eventi o richieste di patch.

Quindi, invece di avere il client che invia tutti i dati più una data al server, il client invia un evento, insieme a un numero di revisione che corrisponde all'ultima volta che il client pensa che i dati siano stati aggiornati. Qualcosa come questo:

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

Una volta che il server riceve questo evento (in modo asincrono), lo riconcilia con altri eventi che potrebbe aver già ricevuto. Ad esempio, è possibile che un altro client che lavora con gli stessi dati abbia già modificato alcune cose, e ora il numero di revisione sul server è su 5. Pertanto, questa revisione dovrà essere applicata prima dell'applicazione degli ultimi 2, e tutti i clienti dovranno essere informati di questa modifica.

Una volta terminato, il server notifica a tutti i client interessati le modifiche e il nuovo numero di revisione corrente. Il client applica quindi queste modifiche e aggiorna il proprio numero di revisione interno.

Il tuo chilometraggio può variare, ma spero che ti aiuti.

Modifica: un altro nome per questo approccio, o una sua variante, è chiamato Accodamento messaggi , come indicato in questa domanda correlata .


Il sistema può essere offline (nessun accesso al server) per alcuni giorni e deve registrare la data in cui si è verificato l'evento, non quando l'evento è stato sincronizzato con il server. Ecco perché devo usare le date. Ho un numero di revisione anche per optimisticLocking, ma per lo stesso motivo, 2 dispositivi potrebbero scaricare la versione X di un POJO e quando si sincronizzano in seguito ogni invio di eventi che devono generare una versione X + 1 e X + 2. E i dispositivi non possono comunicare tra loro.
Walfrat

Il numero di revisione in questa risposta è sempre generato nel server, il client invia vecchi numeri di revisione, non ha bisogno di conoscere altri client poiché l'incremento di revisione non è sua responsabilità. Questa risposta non menziona la risoluzione dei conflitti, che è la parte più importante della soluzione proposta.
Basilevs,

0

Il primo numero sta utilizzando le date come modo per sincronizzare i dati. Sono davvero sicuro di non avere tutti i dettagli della tua soluzione, ma direi che:

  1. Le date sono generate sui cellulari? In questo caso, sei sicuro che l'app in esecuzione sui cellulari utilizzerà sempre le date corrette? Che dire di un utente malintenzionato che è in qualche modo in grado di modificare la data di sistema sul proprio dispositivo mobile? Che dire degli utenti in diversi fusi orari? Come ti ha detto @jeffrey, forse non è l'approccio migliore per fare affidamento sulle date generate sui dispositivi.

  2. Se ho capito bene, usi il controllo della concorrenza ottimista . Non vedo nulla di intrinsecamente sbagliato nel tuo approccio.

  3. Questa domanda riguarda l'implementazione del blocco ottimistico in primavera . Forse puoi trovare ispirazione in esso.


Devo registrare la data in cui l'azione è stata eseguita, in quanto tale sono bloccato con la data del cellulare. La data mobile viene spesso risincronizzata con il sistema. Solo i server registrati possono essere sincronizzati con il server. Per quanto riguarda la sicurezza è un'altra preoccupazione rimasta per ora (autenticazione del dispositivo X509, ...)
Walfrat,

La data potrebbe essere registrata come un altro campo di dati, non è necessario trattarla come token di sincronizzazione.
Basilevs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.