Moi koledzy i ja stworzyliśmy kilka programów architektury klienckiej, które używają delt do synchronizacji klienta z serwerem. Problem związany z usuwaniem rekordów pojawia się w wielu projektach. W jaki sposób serwer może usuwać rekordy lokalnie i nadal ma wystarczającą ilość informacji do wygenerowania informacji o delcie usuwania dla przyszłych klientów?Jak wygenerować delty dla usuniętych danych w architekturze serwera klienta?
Przykład 1:
gra w czasie rzeczywistym wykorzystuje UDP klient-serwer do zsynchronizowania podmioty między grami. Przesyłane są tylko delty zawierające zmodyfikowany stan gry i wcześniej upuszczone dane pakietowe. Jeśli serwer usunie encję, może wysłać deltę usuwania, każąc każdemu klientowi usunąć ten obiekt. Działa to, chyba że pakiet zostanie upuszczony. Jest to możliwe w przypadku normalnych danych stanu, ponieważ serwer może zidentyfikować, które dane zostały usunięte, i ponownie przesłać z nich delta, ale to oznaczałoby, że serwer nie mógłby lokalnie usunąć encji serwera (bez wykonywania pełnego potwierdzenia od każdego klienta), ponieważ istniałyby dane generujące delta usuwania z.
Przykład 2:
klient chce zsynchronizować z bazą danych przechowywanych na serwerze. Serwer przechowuje zmodyfikowaną datę dla każdego rekordu na serwerze. Gdy klient zażąda synchronizacji, przesyła ostatnią datę, która została zaktualizowana. Serwer zbiera wszystkie rekordy, które zostały zmodyfikowane od tej daty i wysyła je do klienta. Działa to z usuwaniem tylko wtedy, gdy serwer zachowuje każdy rekord usunięty i używa flagi do wskazania usunięcia. Serwer nie może bezpiecznie usunąć zapisanego lokalnie rekordu.
W obu przykładach jedynym rozwiązaniem, jakie mogę wymyślić, jest przytrzymanie jakiegoś rekordu zawierającego wszystko, co kiedykolwiek zostało usunięte, lub wymuszenie całej synchronizacji po określonej dacie/godzinie. Nie wydają się one trwałymi lub pełnymi gracji modelami. Jakie są zrównoważone metody rozwiązywania tego typu problemów?
Wykorzystanie dysku i wzrost czasu wyszukiwania. jeśli tysiące klientów potencjalnie przesyła zmiany na serwerze przez cały czas, który może się sumować w ciągu roku - a najgorsze jest to, że nigdy nie mogłem tego wyjaśnić. Jedną ze strategii, którą wymyśliłem dla tego modelu, było wymuszenie pełnej aktualizacji po pewnym czasie, co pozwoliłoby serwerowi usuwać rekordy co 3 miesiące, ale to nie wydaje się być pełnym gracji modelem. W przykładzie UDP myślę, że mógłbym przekazać pewien hasz z obiektem, aby ustalić, czy rekord jest ponownie wykorzystywany przez nowy obiekt. –
Po prostu przeczytaj i zobaczyłem, że Microsoft używa modelu daty wygaśnięcia z kamienowaniem grobów, tak jak to opisałem. –
Tak, pomyślałem o użyciu modelu typu CQRS, który traktował wszystkie delty tak samo, i stos zmian wersji, ale to może złożyć ten konkretny problem z pamięcią masową. Musiałbym przechowywać całą historię wersji dla każdego rekordu lub wprowadzić jakiś okres migawki. –