11

App
Mam aplikację internetową, która obecnie używa AppCache funkcjonalności w trybie offline, ponieważ użytkownicy systemu muszą tworzyć dokumenty w trybie offline. Dokument jest najpierw tworzony w trybie offline, a gdy dostęp do Internetu jest dostępny, użytkownik może kliknąć "synchronizuj", który wyśle ​​dokument na serwer i zapisze go jako wersję. Aby być bardziej szczegółowym, aplikacja nie zapisuje delty zmiany jako wersji (zmienione pole dokładnie), ale raczej całego dokumentu w całości. Innymi słowy, zapisany zostaje dokument "migawki".poprawić funkcjonalność synchronizacji danych klient-serwer z delt

Problem
Użytkownicy mogą zalogować z różnych przeglądarek i urządzeń oraz prac dotyczących ich dokumentów. Po kliknięciu "sync", jeśli dokument serwera jest nowszy, , cała wersja klienta zostanie nadpisana przez serwer. Prowadzi to do jednego głównego problemu, który jest przedstawiony na poniższym obrazku.

enter image description here

Scenariusz powyżej występuje z powodu obecnej implementacji, która nie opiera się na delt (niewielkie zmiany), a raczej opiera się na zmianach migawki.

Niektóre pytania

1) Moje badania wskazują, że powinna być modernizacja „SYNC” mechanizm jest wyrażany w delt (małe zmiany, które mogą być stosowane niezależnie). Czy to rozsądne podejście?

2) Czy każda delta powinna być stosowana niezależnie?

2) Według moich badań delt wersji ma wartość liczbową, a nie znacznik czasu. Jaka powinna być wartość tego dokładnie? Jak mam się upewnić, że zarówno serwer, jak i klient zgadzają się, jaki powinien być numer wersji?

Stos informacji

  • kątowa na frontend
  • IndexedDB zapisywanie dokumentów lokalnie (w trybie offline)
  • Postgres DB z JSONB w backend
+1

pokrewne: http://stackoverflow.com/questions/28797992/best-practices-in-syncing-data –

+0

Git już to robi, może jakoś go używać, aby pokazać różnicy dokumentu użytkownika. –

+1

Jack Wade podsumowuje wszystko dla Ciebie. Za pomocą narzędzia/skryptu diff możesz uzyskać delty, z których większość nie powinna mieć konfliktów (np. Te same linie edytowane), a następnie musisz znaleźć najlepszy sposób na rozwiązanie ewentualnych konfliktów (np. Nasz, ich, ręczne scalanie , ostatnie wygrane itp.). –

Odpowiedz

5

co się opisując to problem z kontrolą wersji, taki jak w this question. Wybór należy do ciebie, jak rozwiązać. Oto kilka przykładów innych produktów z tym problemu:

  • Google Docs: a sprawia edytować w trybie offline, B sprawia, że ​​zmienił Online, przechodzi w tryb online, Sync, Google Docs łączy i edycje B
  • Jabłko zauważa: tak samo jak Google Docs
  • Git/Subversion: wygeneruje błąd, poproś użytkownika do rozwiązywania konfliktów
  • Wunderlist: Ostatni edit nadpisuje poprzednie

Twoim przypadku, to najprostszym rozwiązaniem jest zastosowanie podejścia Wunderlist, ale wydaje się, że może to spowodować problem z użytecznością. Czego oczekują Twoi użytkownicy?

Odpowiadając na pytania bezpośrednio:

  1. Niestandardowy realizacja sync jest konieczne, jeśli nie chcemy nadpisaniu.
  2. To jest decyzja o usłudze, czego oczekuje użytkownik?
  3. Prawda, wersje są numeryczne (np. R1, r2). Aby uzyskać zgodę na serwer, zmień wartość zwracaną ostatniego żądania synchronizacji. Za każdym razem możesz zwrócić cały model do klienta (lub tylko 200 OK, jeśli nastąpiła normalna synchronizacja). Jeśli model zostanie zwrócony klientowi, zaktualizuj klienta przy użyciu najnowszego modelu.

W każdym razie serwer powinien zawsze być źródłem prawdy. This post zapewnia kilka dobrych rad na serwerze/mobile integralność referencyjna:

Aby śledzić wkładki musisz stworzoną datownik ... Aby śledzić aktualizacje musisz śledzić LastUpdate timestamp na swoich wierszy ... Aby śledzić usuwa trzeba stół nagrobny.

Należy pamiętać, że po przeprowadzeniu synchronizacji należy sprawdzić przesunięcie czasowe między serwerem a urządzeniem mobilnym i potrzebna jest metoda rozwiązywania konfliktów. Wstawki nie są wielkim problemem (nie powinny powodować konfliktu), ale aktualizacje mogą powodować konflikt, a usunięcie może powodować konflikt z aktualizacją.

+0

Zmieniłem oryginalną odpowiedź, aby zawierała bardziej szczegółowe informacje. Szkielet nie byłby tu pomocny, głównie dlatego, że nie jest wystarczająco pozytywny i nie ma modelu synchronizacji offline-online, który obsługuje poprawki. –

+1

@dipole_moment OK, jest to klasyczny problem w kontroli wersji. Zaktualizuję. –

Powiązane problemy