Najlepsza praktyka synchronizacji wspólnych danych rozproszonych

Mam aplikację internetową, która obsługuje tryb offline, w którym użytkownicy mogą tworzyć dane, które będą synchronizowane z serwerem, gdy użytkownik wróci do trybu online. Z tego powodu używam identyfikatorów UUID do identyfikacji w mojej bazie danych, więc odłączeni klienci mogą generować nowe obiekty bez obawy o użycie identyfikatora używanego przez innego klienta itp. Jednakże, podczas gdy działa to doskonale dla obiektów, których właścicielem jest ten użytkownik. są obiektami współdzielonymi przez wielu użytkowników. Na przykład tagi używane przez użytkownika mogą być globalne i nie ma możliwości, aby zdalna baza danych mogła przechowywać wszystkie możliwe tagi we wszechświecie.

Jeśli użytkownik offline tworzy obiekt i dodaje do niego kilka znaczników. Powiedzmy, że te tagi nie istnieją w lokalnej bazie danych użytkownika, więc oprogramowanie generuje dla nich identyfikator UUID. Teraz, gdy te znaczniki zostaną zsynchronizowane, konieczne będzie przeprowadzenie procesu rozwiązywania, aby rozwiązać wszelkie nakładanie się. W jakiś sposób można dopasować istniejące znaczniki w zdalnej bazie danych do wersji lokalnych.

Jednym ze sposobów jest użycie procesu, w którym obiekty globalne są rozwiązywane za pomocą naturalnego klucza (nazwa w przypadku znacznika), a lokalna baza danych musi zastąpić istniejący obiekt tym, który jest z globalnej bazy danych. Może to być bałagan, gdy istnieje wiele połączeń z innymi obiektami. Coś mi mówi, żeby tego uniknąć.

Innym sposobem radzenia sobie z tym jest użycie dwóch identyfikatorów. Jeden globalny identyfikator i jeden lokalny identyfikator. Miałem nadzieję, że użycie UUID pomogłoby uniknąć tego, ale ciągle przechodzę tam iz powrotem między używaniem pojedynczego UUID i używaniem dwóch dzielonych identyfikatorów. Użycie tej opcji powoduje, że zastanawiam się, czy pozwoliłem, aby problem wymknął się spod kontroli.

Innym podejściem jest śledzenie wszystkich zmian za pośrednictwem obiektów niewspólnych. W tym przykładzie obiekt, do którego użytkownik przypisał znaczniki. Gdy użytkownik synchronizuje zmiany w trybie offline, serwer może zastąpić swój lokalny tag globalnym. Następnym razem, gdy ten klient synchronizuje się z serwerem, wykrywa zmianę w obiekcie innym niż udostępniony. Gdy klient ściągnie ten obiekt, otrzyma globalny tag. Oprogramowanie po prostu zapisuje niepodzielony obiekt, wskazując go na tag serwera i osierocając jego lokalną wersję. Niektóre problemy z tym związane to dodatkowe rundy podróży w celu pełnej synchronizacji oraz dodatkowe dane w lokalnej bazie danych, która jest po prostu osierocona. Czy są inne problemy lub błędy, które mogą wystąpić, gdy system znajduje się między stanami synchronizacji? (tj. próbuje rozmawiać z serwerem i wysyłać lokalne UUID dla obiektów itp.).

Inną alternatywą jest unikanie wspólnych obiektów. W moim oprogramowaniu może to być akceptowalna odpowiedź. Nie robię wiele wymiany obiektów między użytkownikami, ale to nie znaczy, że NIE będę tego robić w przyszłości. Co oznacza, że ​​wybranie tej opcji może w przyszłości sparaliżować moje oprogramowanie, jeśli będę musiał dodać tego typu funkcje. Są konsekwencje tego wyboru i nie jestem pewien, czy całkowicie je zbadałem.

Więc szukam wszelkiego rodzaju najlepszych praktyk, istniejących algorytmów do obsługi tego typu systemu, wskazówek dotyczących wyborów itp.

questionAnswers(3)

yourAnswerToTheQuestion