Как работает совместная работа в режиме реального времени с несколькими клиентами в системе, использующей преобразования операций с центральным сервером? - PullRequest
7 голосов
/ 29 апреля 2010

Я только что закончил читать Окно с высокой задержкой и низкой пропускной способностью в Jupiter Collaboration System , и я в основном следовал всему до части 6: глобальная согласованность. В этой части описывается, как система, описанная в документе, может быть расширена для размещения нескольких клиентов, подключенных к серверу. Однако объяснение очень короткое и, по сути, говорит, что система будет работать, если центральный сервер просто перенаправит клиентские сообщения всем другим клиентам. Я не очень понимаю, как это работает, хотя. Какой вектор состояния будет отправлен в сообщении, которое отправляется всем другим клиентам? Поддерживает ли сервер отдельные векторы состояния для каждого клиента? Поддерживает ли он отдельную копию виджетов локально для каждого клиента?

Простой пример, который я могу вспомнить, - это установка: представьте, что клиент A, сервер и клиент B с клиентом A и клиентом B оба подключены к серверу. Для начала все три имеют объект состояния "ABCD". Затем клиент A отправляет сообщение «вставить символ F в позиции 0», в то же время клиент B отправляет сообщение «вставить символ G в позиции 0» на сервер. Кажется, что просто передача сообщения клиента A клиенту B и наоборот фактически не обрабатывает этот случай. Так что именно делает сервер?

1 Ответ

6 голосов
/ 29 апреля 2010

Я действительно понял, как это будет работать. В моем примере сервер сохраняет пространство состояний для клиента A и клиента B. В случае, когда сервер сначала получает сообщение клиента A, сервер получает сообщение с вектором состояния (0, 0), вставляет F, а затем обновляет свои векторы состояния быть (1, 0) и (0, 1) для A и B соответственно (где первое число - это количество сообщений от клиента, которые были обработаны, а второе - количество сообщений от сервера, которые были обработаны). обработанный). Затем сервер отправляет «вставить F в позиции 0» с вектором состояния (0, 0) (поскольку это было состояние сервера в пространстве состояний B, когда сообщение было получено сервером) и получает «вставить G в позиции 0» из B отправлено с состоянием (0, 0). Поскольку сервер находится в состоянии (0, 1) в пространстве состояний B, он сначала преобразует сообщение (и, аналогично, поскольку B находится в (1, 0), когда он получает сообщение сервера, он также преобразует сообщение, полученное от сервер). Поскольку преобразования должны быть настроены так, что если xform (c, s) = (c ', s'), то c ', примененный к s, равен s', примененному к c, B, и сервер окажется в том же состоянии. То же самое происходит с сообщением, которое сервер получил от B, а затем отправляет его A.

...