Dove e quali sono le risorse?
REST si occupa di indirizzare le risorse in modo apolide e rilevabile. Non deve essere implementato su HTTP, né deve fare affidamento su JSON o XML, anche se si consiglia vivamente di utilizzare un formato dati ipermediale (vedere il principio HATEOAS ) poiché sono desiderabili collegamenti e ID.
Quindi, la domanda diventa: come si pensa alla sincronizzazione in termini di risorse?
Cos'è la sincronizzazione bidirezionale? **
La sincronizzazione bidirezionale è il processo di aggiornamento delle risorse presenti su un grafico di nodi in modo che, alla fine del processo, tutti i nodi abbiano aggiornato le proprie risorse in conformità con le regole che governano tali risorse. In genere, si ritiene che tutti i nodi dispongano dell'ultima versione delle risorse presenti nel grafico. Nel caso più semplice il grafico è costituito da due nodi: locale e remoto. Local avvia la sincronizzazione.
Quindi la risorsa chiave che deve essere indirizzata è un registro delle transazioni e, quindi, un processo di sincronizzazione potrebbe apparire così per la raccolta "articoli" sotto HTTP:
Passaggio 1: Local recupera il registro delle transazioni
Locale: GET /remotehost/items/transactions?earliest=2000-01-01T12:34:56.789Z
Remoto: 200 OK con corpo contenente il registro delle transazioni contenente campi simili a questo.
itemId
- un UUID per fornire una chiave primaria condivisa
updatedAt
- data / ora per fornire un punto coordinato in cui i dati sono stati aggiornati l'ultima volta (presupponendo che non sia richiesta una cronologia delle revisioni)
fingerprint
- un hash SHA1 del contenuto dei dati per un rapido confronto se updateAt
è fuori di pochi secondi
itemURI
- un URI completo per l'articolo per consentire il recupero in un secondo momento
Passaggio 2: Local confronta il registro delle transazioni remote con il proprio
Questa è l'applicazione delle regole di business su come sincronizzare. In genere, itemId
identifica la risorsa locale, quindi confronta l'impronta digitale. Se c'è una differenza, updatedAt
viene effettuato un confronto di . Se questi sono troppo vicini per essere chiamati, sarà quindi necessario prendere una decisione in base all'altro nodo (forse è più importante) o passare all'altro nodo (questo nodo è più importante). Se la risorsa remota non è presente localmente, viene effettuata una voce push (contiene i dati effettivi per l'inserimento / aggiornamento). Si presume che qualsiasi risorsa locale non presente nel registro delle transazioni remote sia invariata.
Le richieste pull vengono fatte sul nodo remoto in modo che i dati esistano localmente usando il itemURI
. Non vengono applicati localmente fino a dopo.
Passaggio 3: inviare il registro delle transazioni di sincronizzazione locale al remoto
Locale: PUT /remotehost/items/transactions
con corpo contenente il registro delle transazioni di sincronizzazione locale.
Il nodo remoto potrebbe elaborarlo in modo sincrono (se è piccolo e veloce) o in modo asincrono (si pensi ad 202 ACCETTATO ) se è probabile che si verifichino molte spese generali. Supponendo un'operazione sincrona, il risultato sarà 200 OK o 409 CONFLICT a seconda dell'esito positivo o negativo. Nel caso di un CONFLITTO 409 , il processo deve essere riavviato poiché si è verificato un errore di blocco ottimistico nel nodo remoto (qualcuno ha modificato i dati durante la sincronizzazione). Gli aggiornamenti remoti vengono elaborati nell'ambito della propria transazione dell'applicazione.
Passaggio 4: aggiornamento locale
I dati estratti nel passaggio 2 vengono applicati localmente nell'ambito di una transazione dell'applicazione.
Sebbene quanto sopra non sia perfetto (ci sono diverse situazioni in cui locale e remoto possono avere problemi e avere dati di pull remoti da locale è probabilmente più efficiente di metterli in un grande PUT), dimostra come REST può essere usato durante un bi- processo di sincronizzazione direzionale.