2010-04-28 14 views
6

Właśnie skończyłem czytać High-Latency, Low-Bandwidth Windowing in the Jupiter Collaboration System i przeważnie śledziłem wszystko aż do części 6: globalna konsystencja. W tej części opisano sposób, w jaki opisany w artykule system można rozszerzyć tak, aby był dostępny dla wielu klientów podłączonych do serwera. Jednak wyjaśnienie jest bardzo krótkie i zasadniczo mówi, że system będzie działał, jeśli serwer centralny przesyła jedynie komunikaty klienta do wszystkich innych klientów. Naprawdę nie rozumiem, jak to działa. Jaki wektor stanu zostanie wysłany w wiadomości wysyłanej do wszystkich innych klientów? Czy serwer utrzymuje osobne wektory stanu dla każdego klienta? Czy zachowuje osobną kopię widgetów lokalnie dla każdego klienta?W jaki sposób współpraca w czasie rzeczywistym z wieloma klientami działa w systemie wykorzystującym transformacje operacyjne z serwerem centralnym?

Prostym przykładem, jaki mogę wymyślić, jest ta konfiguracja: wyobraź sobie klienta A, serwer i klienta B z klientem A i klientem B połączonymi z serwerem. Aby rozpocząć, wszystkie trzy mają obiekt stanu "ABCD". Następnie klient A wysyła komunikat "wstaw znak F w pozycji 0" w tym samym czasie, gdy klient B wysyła komunikat "wstaw znak G w pozycji 0" do serwera. Wydaje się, że po prostu przekazanie wiadomości klienta A do klienta B i na odwrót w rzeczywistości nie obsługuje tej sprawy. Co dokładnie robi serwer?

Odpowiedz

5

Właściwie to zorientowałem się, jak to zadziała. W moim przykładzie serwer utrzymuje przestrzeń stanu dla klienta A i klienta B. W przypadku, gdy serwer najpierw otrzymuje komunikat klienta A, serwer otrzymuje komunikat z wektorem stanu (0, 0), wstawia F, a następnie aktualizuje wektory stanu to be (1, 0) i (0, 1) odpowiednio dla A i B (gdzie pierwsza liczba to liczba wiadomości od klienta, które zostały przetworzone, a druga to liczba wiadomości z serwera, które zostały obrobiony). Następnie serwer wysyła "wstaw F w pozycji 0" z wektorem stanu (0, 0) (ponieważ był to stan serwera w przestrzeni stanu B po odebraniu wiadomości przez serwer) i otrzymuje "wstaw G w pozycji 0" z B wysłane ze stanem (0, 0). Ponieważ serwer znajduje się w stanie (0, 1) w przestrzeni stanów B, najpierw przekształca komunikat (i podobnie, ponieważ B jest w (1, 0) po odebraniu wiadomości serwera, przekształca również komunikat otrzymany z serwera serwer). Ponieważ transformacje muszą być ustawione tak, że jeśli xform (c, s) = (c ', s') to c 'zastosowany do s jest równy s' zastosowany do c, B i serwer kończy się w tym samym stanie. To samo dzieje się z komunikatem, który serwer otrzymał od B, a następnie wysyła do A.

+0

Dla potomności, w przypadku, gdy nie było to jasne: serwer działa jako "klient proxy" między "A" i "B", tłumacząc op od 'A' (' a') do 'a'' i * naprzód * op' a'' do 'B' (tak jakby sam serwer wygenerował operację). Serwer posiada kopie obu kolejek operacji "A" i "B", podczas gdy 'A' i' B' mają tylko kopię kolejki operacji serwera. Aby uzyskać dalsze informacje, sprawdź * Kontrola współbieżności w systemach Groupware * i * A Próba na kontrpropozycji do rozproszonej transformacji operacyjnej i poprawionego algorytmu komunikacji punkt-punkt *. – mzhang