Synchronizacja w scenariuszu centralnej bazy + klienci offline

0

Witam,

Napisałem aplikacje która działa następująco:

  1. Jest centralna baza danych online z danymi wszystkich klientów
  2. Są klienci pracujący offline z własnymi kopiami danych (struktura bazy centralnej i klienckiej jest taka sama), na żądanie wykonywana jest synchronizacja danych ale każdy klient musi pobierać tylko te dane do których ma uprawnienia!

Obecnie mam web-service który jest wywoływany przez klienta i za pomocą niego po kolei porównuję np tabele A na serwerze z tabelą A u klienta (mam pola data ostatniej modyfikacji itp)

Problem polega na tym że rozwiązanie takie jest mało wydajne. Web-Service napisany cały od A do Z prze zemnie, działa i wycisnąć się już z niego więcej nie da!

Proszę osoby mające już do czynienia najlepiej w środowiskach komercyjnych z rozwiązywaniem podobnych problemów synchronizacji danych. Próbowałem w pierwszych rewizjach projektu użyć dostępnego Frameworka: Microsoft Sync Framework (nie pod WCF a w kodzie klienta - WPF) ale po pierwsze problem był z przekazywaniem podczas synchronizacji dynamicznych parametrów (chodziło o to że użytkownik A miał dostęp tylko do danych gdzie rola w jakiej jest jest wskazana) a po drugie piekielnie wolno to działało (znalazłem nawet oficjalny komunikat że jest to jakiś błąd i należy przenieść z kodu klienta ten mechanizm do webserwica), zrezygnowałem tez ponieważ według moich obserwacji projekt MS Sync jest nierozwijany od 2010 roku (wersja 2.1 lub 4.0 bo tu tez jest komplikacja i niejasność na stronie projektu).

Dlatego jeśli ktoś spotkał się z jakimś rozwijanym i dobrym narzędziem, biblioteką, mechanizmem i może je polecić zarazem jeśli jest dla tego narzędzia silne wsparcie i jest ono rozwijane a nie zapomniane to prosze o linki.

Ponadto jezli ktoś mógłby podzielić się radami (bo miał podobny problem do rozgryzienia) to też proszę o takie (np. napisz WCF Data Service i synchronizuj tak i tak...)

Pozdrawiam
Oskar

0

po pierwsze synchronizacja na podstawie daty to bardzo śliska sprawa. Przecież daty na serwerze i kompie mogą być różne. Jak kiedyś coś takiego robiłem (z tym, że synchronizacja była w obie strony) to każda tabela miała swój generator i przy każdym update/insert triggerem było zmieniane pole z wersją rekordu. Przy delete id usuwanych były zapisywane w osobnej tabeli (żeby nie trzeba było ciągnąć listy wszystkich rekordów i sprawdzać, które zostały usunięte). Każdy klient miał zapisaną wersję rekordu na serwerze, do której jest zsynchronizowany.
Co do samej prędkości to pomaga pakowanie strumienia (jak ja to robiłem to nie mogłem użyć WCF tylko Web Services z własnymi klasami do kompresji strumienia. Ale to pomaga tylko jeśli wąskim gardłem jest sama ilość danych przesyłanych przez sieć, co przy łączu 1Gb może mieć dużo mniejsze znaczenie niż np. przez wifi czy internet.
Dodatkowo klasy, które pchasz jako wynik wywołania WebService dobrze, żeby miały jak najkrótsze nazwy pól - nawet jedno czy dwu znakowe. Jeśli masz np. 10 pól, każda po 15 znaków nazwy i przesyłasz 1000 rekordów to na samych nazwach masz 10 x 15 x 1 000 = 150 000 znaków do przesłania. Jeśli teraz zredukujesz nazwy pól do 2 znaków to masz 10 x 2 x 1 000 = 20 000 znaków. Różnica do przesłania to 130 000 znaków. Nie są to może jakieś ogromne ilości ale jednak.
Zobacz sobie jak wygląda goły XML i zobacz co możesz tam zredukować.

Jeśli jest wolno bo aż tyle się zmienia to wątpię abyś to jakoś przyśpieszył.

Możesz też pokazać jakiś kod :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1