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ć :
- Czy ten sposób ma sens? Dopóki objętość i czas procesu synchronizacji są nadal dopuszczalne.
- Ogólnie, na jakie pojęcia powinienem spojrzeć. Premia: jeśli istnieje jakakolwiek implementacja tych koncepcji w module Spring.
źródło
Odpowiedzi:
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:
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 .
źródło
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:
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.
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.
To pytanie dotyczy wdrożenia blokady optymistycznej na wiosnę . Może znajdziesz w tym trochę inspiracji.
źródło