Où et quelles sont les ressources?
REST consiste à adresser les ressources de manière apatride et détectable. Il n'a pas besoin d'être implémenté sur HTTP, ni de s'appuyer sur JSON ou XML, bien qu'il soit fortement recommandé d'utiliser un format de données hypermédia (voir le principe HATEOAS ) car les liens et les identifiants sont souhaitables.
Alors, la question devient: comment penser la synchronisation en termes de ressources?
Qu'est-ce que la synchronisation bidirectionnelle? **
La synchronisation bidirectionnelle est le processus de mise à jour des ressources présentes sur un graphe de nœuds afin qu'à la fin du processus, tous les nœuds aient mis à jour leurs ressources conformément aux règles régissant ces ressources. En règle générale, cela signifie que tous les nœuds disposeraient de la dernière version des ressources telles qu'elles sont présentes dans le graphique. Dans le cas le plus simple, le graphique se compose de deux nœuds: local et distant. Local lance la synchronisation.
Ainsi, la ressource clé qui doit être adressée est un journal des transactions et, par conséquent, un processus de synchronisation peut ressembler à ceci pour la collection "items" sous HTTP:
Étape 1 - Local récupère le journal des transactions
Local: GET /remotehost/items/transactions?earliest=2000-01-01T12:34:56.789Z
À distance: 200 OK avec un corps contenant le journal des transactions contenant des champs similaires à celui-ci.
itemId
- un UUID pour fournir une clé primaire partagée
updatedAt
- horodatage pour fournir un point coordonné lors de la dernière mise à jour des données (en supposant qu'aucun historique de révision n'est requis)
fingerprint
- un hachage SHA1 du contenu des données pour une comparaison rapide en updateAt
quelques secondes
itemURI
- un URI complet à l'élément pour permettre une récupération ultérieure
Étape 2 - Local compare le journal des transactions distant avec le sien
Il s'agit de l'application des règles commerciales de synchronisation. En règle générale, le itemId
identifie la ressource locale, puis compare l'empreinte digitale. S'il y a une différence, une comparaison updatedAt
est effectuée. Si ceux-ci sont trop proches pour être appelés, une décision devra être prise pour tirer en fonction de l'autre nœud (peut-être que c'est plus important), ou pour pousser vers l'autre nœud (ce nœud est plus important). Si la ressource distante n'est pas présente localement, une entrée push est effectuée (elle contient les données réelles pour l'insertion / la mise à jour). Toutes les ressources locales non présentes dans le journal des transactions distant sont supposées être inchangées.
Les demandes d'extraction sont effectuées sur le nœud distant afin que les données existent localement à l'aide de itemURI
. Ils ne sont appliqués localement que plus tard.
Étape 3 - Envoyer le journal des transactions de synchronisation locale à distance
Local: PUT /remotehost/items/transactions
avec corps contenant le journal des transactions de synchronisation local.
Le nœud distant peut traiter cela de manière synchrone (s'il est petit et rapide) ou asynchrone (pensez 202 ACCEPTÉ ) s'il est susceptible d'entraîner une surcharge importante. En supposant une opération synchrone, le résultat sera soit 200 OK ou 409 CONFLIT selon le succès ou l'échec. Dans le cas d'un 409 CONFLICT , alors le processus doit être redémarré car il y a eu une défaillance de verrouillage optimiste au niveau du nœud distant (quelqu'un a changé les données pendant la synchronisation). Les mises à jour à distance sont traitées dans le cadre de leur propre transaction d'application.
Étape 4 - Mettre à jour localement
Les données extraites à l'étape 2 sont appliquées localement dans le cadre d'une transaction d'application.
Bien que ce qui précède ne soit pas parfait (il existe plusieurs situations où local et distant peuvent avoir des problèmes et avoir des données d'extraction à distance du local est probablement plus efficace que de les mettre dans un gros PUT), il montre comment REST peut être utilisé pendant un bi- processus de synchronisation directionnelle.