Qual è la migliore implementazione per la sincronizzazione delle app per dispositivi mobili offline?

6

Abbiamo un'app per Android scritta come Cordova AngularJS SPA, che ora è cresciuta, quindi è necessario aggiungerci un po 'di lavoro, il che significa che dobbiamo migliorare la parte di sincronizzazione dell'app. L'app è principalmente utilizzata offline. Non posso fornire dettagli sull'utilizzo aziendale, ma la struttura dei dati e i vincoli possono essere illustrati con un'attività di un meccanico automobilistico troppo semplificato!

Immagina che le entità dei dati siano simili a questo:

Lerivendicazionisonoalivellodicompagnia,garageeauto,quindiinaltreparoleJackpotrebbeessereingradodivederetuttiigarageetutteleautodellacompagniaA,JillpotrebbeessereingradodivederetuttiigaragenellacompagniaAesoloalcuneautoinognigarageJopotrebbeessereingradodivederesoloungarageesoloalcunedelleautoinquelgarage.-haicapitol'idea.

  • L'appscaricaleinformazionicheilmeccanicopuòvederesullorolavoro.Sonoingradodivederetuttiilavoriassegnatialoroequalsiasialtrolavorocheleaffermazionichehannopermessolorodivedere,inmodochepossanosceglierequeilavori.Unlavoroèunraggruppamentodipostidicontrollochedevonoesserecompletatisuunamacchina.
  • L'officinadelgaragenonhaunaconnessionedati,ilmeccanicopuòsincronizzarsisoloquandotornainufficio.Questopotrebbedoveressereavviatodall'utente,manonèancoradeltuttosicuro.
  • Piùdiunmeccanicopuòlavoraresuunlavoro,selostessodatovieneaggiornatodaentrambiimeccanici,vincel'ultimoelementosincronizzato.
  • Seunelementodatièstatoaggiornatosulserverdaquandoilmeccanicol'hascaricatonell'apptablet,l'haaggiornatoecaricato,ilcambiamentodelmeccanicovince.
  • Ilavoripossonoesserecompletatisoloparzialmentealmomentodellasincronizzazione.
  • Quandol'appsisincronizza,ènecessarioapplicarelemodificheinessocontenuteeaggiornareidatiarchiviatilocalmenteconleinformazionipiùaggiornatedaldatabaseSQL.Potrebbeesserenecessariorimuovereidatidall'appchenonsonopiùrilevantiperilavorisucuisistalavorandoattualmenteoinfuturo.

Ilback-endèospitatosuAzure,idatimemorizzatiinundatabaseSQLdiAzure.C'èun'APIODatachestiamoritirandoeun'APIWebchepuòessereutilizzata/aggiunta.L'autorizzazionecomplessaavvieneall'internodiunmodulocondivisonelleAPI,gliunicidatiacquisitiinun'appsonodatichel'utenteèautorizzatoavedere.

Idatidiventerannopiuttostograndineltempo.

Questodeveesseretransazionale-es.Sec'èunproblemaconlasincronizzazione,vogliamocheuninterolavorosiastatosincronizzatoallavolta,noniltipodientitàallavolta.

L'appèstatascrittacomeapplicazioneSPACordovaquindi,amenochenonvisiaunvalidomotivopernonfarlo,deverimanereinquestomodo.

Ideecheabbiamoconsideratofinora:

BreezeJSèstatoutilizzatoperteneretracciadellemodifiche.Potremmoinviaresolotalimodifichealserver,attendereunprocessosulserverperapplicaretalimodifichealdatabaseequindiavviareildownloaddieventualimodificheenuovidatirichiesti.Tuttavia,ciòpotrebbesignificarechelasincronizzazionerichiederàmoltotempoperesserecompletatasemoltepersonesisincronizzanocontemporaneamenteelecosesiintasanoinunacodadiqualchetipo.

UsandoCouchDb/PouchDB-Nesomoltopoco,questofunzionerebbeconilmodellodiautorizzazionecheabbiamo?Ecomefunzionerebbeottenerelemodificheda/perildatabaseSQLprincipale?

SincronizzazionedeidatiofflinediAzure( link ) - Per quanto posso vedere questo è abbastanza simile all'utilizzo di CouchDb, o ho frainteso?

Il modello di autorizzazione richiesto è la parte che sembra essere il bloccante di molte soluzioni che sono vitali, abbiamo bisogno che utenti diversi abbiano set diversi di dati comuni in un dato momento, questo è un imperativo.

    
posta crockels 20.01.2017 - 09:49
fonte

2 risposte

2

Se hai intenzione di sincronizzarti con il tuo database SQL principale, avrai sempre lo stesso problema: come risolvi le modifiche in conflitto?

CouchDB non ti aiuta lì. In modo esplicito non gestisce i conflitti e lascia all'utente la gestione (selezionandone i lati). Anche altre soluzioni non possono aiutarti, perché per risolvere un conflitto devi capire il significato dei dati che si trovano in uno stato conflittuale. In altre parole, non esiste una soluzione "perfetta" generica a questo problema.

Il mio consiglio sarebbe di sviluppare qualche soluzione tu stesso usando le modifiche di caricamento in una strategia di coda che hai descritto. Le prestazioni probabilmente non saranno il tuo problema più grande, ma la risoluzione dei conflitti sarà. Scegli una delle diverse strategie per gestire quella coda:

  1. Controllo della concorrenza ottimistico

Tieni traccia del timestamp quando un cliente estrae i dati dal sistema e quando carica una nuova versione di tali dati controlla che non siano avvenute modifiche. Se si verificano cambiamenti, utilizzare la strategia 3 o consentire all'utente di forzare o scartare.

  1. Blocco

Consentire all'utente di eseguire esplicitamente un'operazione di "check out" e "check in". Alcune cose di base da tenere in considerazione: gli altri utenti devono essere in grado di vedere chi ha un lucchetto e togliere quel blocco. Solo l'utente con un blocco può verificare le modifiche apportate ai dati contenuti in tale blocco. Guarda come la sovversione (e i clienti come tortoisesvn) gestisce le serrature, è sensato, per quanto riguarda queste cose.

  1. Fusione

Questa è una variante della strategia 1, tranne che quando rilevi conflitti esegui un'unione. Puoi implementarlo utilizzando più strategie. L'ultimo vince, il primo vince, la scelta esplicita dell'utente (probabilmente mostrando il delta). Puoi ridurre il rischio di conflitti rintracciando i dati a un livello più fine (per-field anziché per-form).

    
risposta data 24.01.2017 - 14:53
fonte
0

Non ho tutti i dettagli di fronte a me, ma ...

Con Azure, puoi combinare il loro servizio di app per dispositivi mobili come back-end per gestire la natura multiutente di esso. E se ricordo male, puoi usare un'istanza di dati SQL ad esso connessa per il vero database.

In qualunque modo tu vada, penso che avrai bisogno di un backend di servizi web di qualche tipo per coordinare la natura multiutente della tua app. Non penso che ci sia un buon modo per aggirare questo requisito.

Come affermato da @Joeri Sebrechts, l'altro metodo richiede fondamentalmente agli utenti di controllare i dati e essere responsabili . Alcuni giorni mi fido a malapena degli sviluppatori per farlo.

    
risposta data 23.02.2017 - 15:45
fonte

Leggi altre domande sui tag