Synchronizacja z systemem offline

9

Projektuję system, z którego zsynchronizuję dane biznesowe z urządzenia mobilnego (które mają wbudowaną aplikację), który generuje dane i odsyła je z powrotem na serwer. Każda zsynchronizowana linia generuje określony dziennik biznesowy w bazie danych.

Jeśli to, co synchronizuję, generuje dane z datą (w ramach danych synchronizacji) gorszą od daty ostatniej modyfikacji moich danych biznesowych, muszę to zignorować i po prostu dodać bazę danych logowania. Po przetworzeniu przesłanych danych dane są pobierane z bazy danych i pobierane na urządzenie.

Ze względu na to pobieranie zaraz po zapisie synchronizacja musi być synchroniczna. Nadal można mieć wzorzec odczytu / zapisu, jeśli coś takiego jest wystarczająco warte, aby zastąpić moje istniejące rozwiązanie. Ważniejszą rzeczą jest możliwość pobierania aktualnych danych. Ze względu na to, że dane są pobierane jako całość, nie ma obecnie zaimplementowanej różnicy (może przyjść później, ale to nie będzie problem).

Mogę mieć wiele synchronizacji na tym samym obiekcie biznesowym, jest to mało prawdopodobne, ale może się zdarzyć i wolę być w stanie sobie z tym poradzić. Oczekuje się, że synchronizacja potrwa kilka sekund, ale nie kilka minut, chyba że przez kilka dni będzie używana wbudowana aplikacja mobilna bez ponownej synchronizacji.

Wolumen synchronizowanych danych nie powinien być duży, ani proces synchronizacji.

Skończyło się więc na wzajemnym wykluczeniu mojej metody synchronizacji, a dokładniej używam Javy i zsynchronizowałem metodę pisania, a nie cały proces synchronizacji, aby nie blokować synchronizacji tylko do odczytu.

Chciałbym wiedzieć :

  1. Czy ten sposób ma sens? Dopóki objętość i czas procesu synchronizacji są nadal dopuszczalne.
  2. Ogólnie, na jakie pojęcia powinienem spojrzeć. Premia: jeśli istnieje jakakolwiek implementacja tych koncepcji w module Spring.
Walfrat
źródło
Co powoduje offline? Mam na myśli, że gdy urządzenie jest offline, oznacza to, że nie ma dostępu tylko do serwera lub nie ma dostępu do Internetu?
Laiv
Nie ma dostępu do Internetu. Lub nie często.
Walfrat
Jeśli synchronizujesz wielu klientów / serwery, musisz najpierw zdecydować o zarządzaniu danymi, na wypadek gdyby coś się różniło. Jeśli weźmiesz pod uwagę tylko połączenia przerywane i wielu klientów, zdecydowanie nie ma możliwości zrobienia tego przyrostowo.
tofro
W moim przypadku @tofro mastering danych jest łatwe do ustalenia, więc nie stanowi problemu. Dlaczego jednak nie byłoby możliwe stopniowe wykonywanie połączeń przerywanych? Czy nie powinienem móc po prostu użyć daty ostatniej synchronizacji? Jedynym problemem w moim przypadku przy użyciu takiej daty byłoby wiedzieć, że dane, które są obecnie na moim urządzeniu, zostały przeniesione i powinny zostać usunięte na urządzeniu.
Walfrat
Z twojego opisu zrozumiałem, że ten sam element danych można zmienić na serwerze lub na jednym lub wielu klientach. Jak zsynchronizowałbyś w trzy strony element danych, który trafił na telefon komórkowy nr 1, a następnie został zmieniony na serwerze, a następnie na telefon komórkowy nr 2 i został tam zmieniony, a następnie telefon komórkowy nr 1 łączy się (z odłączonym telefonem komórkowym nr 2)?
tofro

Odpowiedzi:

1

Jednym ze sposobów, że byłem dochodzenie na chwilę teraz (z pewnymi sukcesami), aby zsynchronizować dane klienta z serwerem danych, nie opierając się na terminach (co może być zawodna) lub synchroniczne żądania, to połączenie JSON Patches (chyba POJO s w twoim przypadku) i pozyskiwanie zdarzeń .

Podstawową ideą jest to, że zamiast zapisywać bieżący stan na kliencie i serwerze, klient i serwer przechowują listę zmian i przesyłają sobie komunikaty poprzez zdarzenia lub żądania łatek.

Zamiast więc wysyłać do serwera wszystkie dane plus datę, klient wysyła zdarzenie wraz z numerem wersji, który odpowiada ostatniej aktualizacji danych przez klienta. Coś takiego:

Server.send("MODIFY FOO", 3);

Gdy serwer otrzyma to zdarzenie (asynchronicznie), uzgadnia je z innymi zdarzeniami, które mógł już odebrać. Na przykład możliwe jest, że inny klient pracujący z tymi samymi danymi mógł już zmodyfikować niektóre rzeczy, a teraz numer wersji na serwerze to 5. W związku z tym ta zmiana będzie musiała zostać zastosowana przed zastosowaniem ostatnich 2 i wszystkie klienci będą musieli zostać powiadomieni o tej zmianie.

Po zakończeniu pracy serwer powiadamia wszystkich zainteresowanych klientów o dokonanych zmianach i nowym bieżącym numerze wersji. Następnie klient stosuje te zmiany i aktualizuje swój wewnętrzny numer wersji.

Twój przebieg może się różnić, ale mam nadzieję, że to pomoże.

Edycja: Inną nazwą tego podejścia lub jego odmianą jest kolejkowanie wiadomości , jak wspomniano w powiązanym pytaniu .

Jeffrey Sweeney
źródło
System może być w trybie offline (brak dostępu do serwera) przez kilka dni i musi zarejestrować datę wystąpienia zdarzenia, a nie synchronizację zdarzenia z serwerem. Dlatego muszę używać dat. Mam też numer wersji dla optymistycznego blokowania, ale z tego samego powodu 2 urządzenia mogą pobrać wersję X POJO, a kiedy zsynchronizują później, każde z nich wysyła zdarzenia, które muszą wygenerować wersję X + 1 i X + 2. A urządzenia nie mogą się ze sobą komunikować.
Walfrat,
Numer rewizji w tej odpowiedzi jest zawsze generowany na serwerze, klient wysyła stare numery rewizji, nie musi wiedzieć o innych klientach, ponieważ nie jest odpowiedzialny za przyrost wersji. Ta odpowiedź nie wspomina o rozwiązaniu konfliktu, który jest najważniejszą częścią proponowanego rozwiązania.
Basilevs,
0

Pierwszym problemem jest użycie dat jako sposobu synchronizacji danych. Jestem pewien, że nie znałem wszystkich szczegółów twojego rozwiązania, ale powiedziałbym, że:

  1. Czy daty są generowane na telefonach komórkowych? Czy w takim przypadku masz pewność, że aplikacja działająca na telefonach komórkowych zawsze będzie używać prawidłowych dat? Co ze złośliwym użytkownikiem, który może zmienić datę systemową na swoim urządzeniu mobilnym? Co z użytkownikami w różnych strefach czasowych? Jak powiedział @jeffrey, być może nie jest to najlepsze podejście do polegania na datach generowanych na urządzeniach.

  2. Jeśli dobrze zrozumiałem, korzystasz z Optymistycznej Kontroli Współbieżności . Nie widzę niczego, co jest zasadniczo błędne w twoim podejściu.

  3. To pytanie dotyczy wdrożenia blokady optymistycznej na wiosnę . Może znajdziesz w tym trochę inspiracji.

danidemi
źródło
Muszę zapisać datę wykonania akcji, dlatego utknąłem z datą telefonu komórkowego. Data mobilna jest często ponownie synchronizowana z systemem. Tylko zarejestrowani użytkownicy mogą synchronizować się z serwerem. Jeśli chodzi o bezpieczeństwo, pozostaje jeszcze jedna
kwestia
Data może być zapisana jako kolejne pole danych, nie trzeba traktować jej jako tokena synchronizacji.
Basilevs,