2010-04-28 5 views
6

Acabo de terminar de leer High-Latency, Low-Bandwidth Windowing in the Jupiter Collaboration System y casi todo lo he seguido hasta la parte 6: consistencia global. Esta parte describe cómo el sistema descrito en el documento puede ampliarse para acomodar a varios clientes conectados al servidor. Sin embargo, la explicación es muy breve y básicamente dice que el sistema funcionará si el servidor central simplemente envía los mensajes del cliente a todos los otros clientes. Realmente no entiendo cómo funciona esto. ¿Qué vector de estado se enviaría en el mensaje que se envía a todos los otros clientes? ¿El servidor mantiene vectores de estado separados para cada cliente? ¿Mantiene una copia separada de los widgets localmente para cada cliente?¿Cómo funciona la colaboración en tiempo real con múltiples clientes en un sistema que usa transformaciones de operación con un servidor central?

El ejemplo simple en el que puedo pensar es esta configuración: imagine que el cliente A, el servidor y el cliente B con el cliente A y el cliente B están conectados al servidor. Para comenzar, los tres tienen el objeto de estado "ABCD". Entonces, el cliente A envía el mensaje "inserte el carácter F en la posición 0" al mismo tiempo que el cliente B envía el mensaje "inserte el carácter G en la posición 0" al servidor. Parece que simplemente retransmitir el mensaje del cliente A al cliente B y viceversa en realidad no maneja este caso. Entonces, ¿qué hace exactamente el servidor?

Respuesta

5

De hecho, descubrí cómo funcionaría esto. En mi ejemplo, el servidor mantiene un espacio de estado para el cliente A y el cliente B. En el caso donde el servidor recibe primero el mensaje del cliente A, el servidor recibe el mensaje con el vector de estado (0, 0), inserta F y luego actualiza sus vectores de estado ser (1, 0) y (0, 1) para A y B, respectivamente (donde el primer número es la cantidad de mensajes del cliente que se han procesado y el segundo es la cantidad de mensajes del servidor que se han procesado). procesada). El servidor envía "inserte F en la posición 0" con el vector de estado (0, 0) (ya que este era el estado del servidor en el espacio de estado de B cuando el servidor recibió el mensaje) y obtiene "inserte G en la posición 0" desde B enviado con estado (0, 0). Como el servidor está en estado (0, 1) en el espacio de estado de B, primero transforma el mensaje (y de manera similar, dado que B está en (1, 0) cuando recibe el mensaje del servidor, también transforma el mensaje que recibió del servidor). Debido a que las transformaciones deben configurarse de modo que si xform (c, s) = (c ', s'), c 'aplicado a s es igual a s' aplicado a c, B y el servidor termina en el mismo estado. Lo mismo ocurre con el mensaje que el servidor recibió de B y luego lo envía a A.

+0

Para la posteridad, en caso de que no esté claro: el servidor actúa como un "cliente proxy" entre 'A' y' B', traduciendo una op de 'A '(' a') a 'a'', y * reenvía * op' a'' a 'B' (como si el propio servidor generara el op). El servidor, entonces, tiene copias de las colas de operación 'A' y 'B', mientras que 'A' y 'B' solo tienen una copia de la cola de operación del servidor. Para obtener más información, consulte * Control de concurrencia en sistemas Groupware *, y * Un contraejemplo para la Transformación operacional distribuida y un Algoritmo corregido para Comunicación punto a punto *. – mzhang

Cuestiones relacionadas