Gdzie i jakie są zasoby?
REST polega na adresowaniu zasobów w sposób bezstanowy i możliwy do wykrycia. Nie musi być implementowany przez HTTP, ani nie musi polegać na JSON ani XML, chociaż zdecydowanie zaleca się stosowanie formatu danych hipermedialnych (patrz zasada HATEOAS ), ponieważ pożądane są linki i identyfikatory.
Powstaje zatem pytanie: jak ocenia się synchronizację pod względem zasobów?
Co to jest synchronizacja dwukierunkowa? **
Dwukierunkowa synchronizacja to proces aktualizowania zasobów obecnych na wykresie węzłów, tak aby pod koniec procesu wszystkie węzły zaktualizowały swoje zasoby zgodnie z regułami rządzącymi tymi zasobami. Zazwyczaj należy rozumieć, że wszystkie węzły miałyby najnowszą wersję zasobów obecnych na wykresie. W najprostszym przypadku wykres składa się z dwóch węzłów: lokalnego i zdalnego. Lokalny inicjuje synchronizację.
Tak więc kluczowym zasobem, który należy rozwiązać, jest dziennik transakcji, a zatem proces synchronizacji może wyglądać tak dla kolekcji „pozycji” w HTTP:
Krok 1 - Lokalny pobiera dziennik transakcji
Lokalny: GET /remotehost/items/transactions?earliest=2000-01-01T12:34:56.789Z
Zdalny: 200 OK z treścią zawierającą dziennik transakcji zawierający pola podobne do tego.
itemId
- UUID w celu udostępnienia wspólnego klucza podstawowego
updatedAt
- znacznik czasu zapewniający skoordynowany punkt ostatniej aktualizacji danych (przy założeniu, że historia zmian nie jest wymagana)
fingerprint
- skrót SHA1 zawartości danych do szybkiego porównania, jeśli updateAt
upłynie kilka sekund
itemURI
- pełny identyfikator URI elementu, aby umożliwić późniejsze pobranie
Krok 2 - Lokalny porównuje zdalny dziennik transakcji z własnym
Jest to zastosowanie reguł biznesowych dotyczących synchronizacji. Zazwyczaj itemId
identyfikuje zasób lokalny, a następnie porównuje odcisk palca. Jeśli istnieje różnica, dokonuje się porównania updatedAt
. Jeśli są zbyt blisko, aby zadzwonić, wówczas trzeba będzie podjąć decyzję o pobraniu w oparciu o drugi węzeł (być może jest to ważniejsze) lub o przepchnięciu do drugiego węzła (ten węzeł jest ważniejszy). Jeśli zdalny zasób nie jest obecny lokalnie, wprowadzany jest wpis wypychany (zawiera on rzeczywiste dane do wstawienia / aktualizacji). Zakłada się, że wszelkie zasoby lokalne nieobecne w zdalnym dzienniku transakcji pozostają niezmienione.
Żądania ściągania są wysyłane do zdalnego węzła, aby dane istniały lokalnie przy użyciu itemURI
. Nie są stosowane lokalnie do później.
Krok 3 - Wciśnij dziennik transakcji synchronizacji lokalnej do zdalnego
Lokalny: PUT /remotehost/items/transactions
z treścią zawierającą dziennik transakcji synchronizacji lokalnej.
Węzeł zdalny może przetwarzać to synchronicznie (jeśli jest mały i szybki) lub asynchronicznie (pomyśl 202 ZAAKCEPTOWANO ), jeśli może to spowodować znaczne obciążenie. Zakładając synchroniczną operację, wynik będzie wynosił 200 OK lub 409 KONFLIKT, w zależności od powodzenia lub niepowodzenia. W przypadku KONFLIKTU 409 proces musi zostać ponownie uruchomiony, ponieważ w zdalnym węźle wystąpił optymistyczny błąd blokowania (ktoś zmienił dane podczas synchronizacji). Zdalne aktualizacje są przetwarzane w ramach własnej transakcji aplikacji.
Krok 4 - Zaktualizuj lokalnie
Dane pobrane w kroku 2 są stosowane lokalnie w ramach transakcji aplikacji.
Chociaż powyższe nie jest idealne (istnieje kilka sytuacji, w których lokalny i zdalny może wpaść w kłopoty, a zdalne pobieranie danych z lokalnego jest prawdopodobnie bardziej wydajne niż umieszczanie go w dużym PUT), pokazuje jednak, w jaki sposób można użyć REST podczas bi- proces synchronizacji kierunkowej.