Как реализовать детерминированное разрешение конфликтов для неупорядоченных потоков исправлений JSON в совместном редактJavascript

Форум по Javascript
Ответить
Anonymous
 Как реализовать детерминированное разрешение конфликтов для неупорядоченных потоков исправлений JSON в совместном редакт

Сообщение Anonymous »

Я создаю на JavaScript редактор для совместной работы в режиме реального времени, в котором несколько клиентов редактируют общий документ JSON. Обновления отправляются через WebSockets как операции в стиле JSON Patch.
Ограничения:
  • Клиенты немедленно применяют оптимистичные локальные обновления.
  • Удаленные исправления могут приходить не по порядку.
  • Клиенты могут отключаться от сети, а затем повторно подключаться.
  • При повторном подключении сервер воспроизводит пропущенные операции.
  • Документ может быть глубоко вложенным.
  • Пользователи могут отменять и повторять локальные изменения.
Проблема в том, что одновременное редактирование перекрывающихся путей приводит к недетерминированным состояниям между клиентами.
Пример:

Код: Выделить всё

Client A applies:
{ op: "replace", path: "/user/name", value: "Alice" }
Client B applies:
{ op: "replace", path: "/user", value: { name: "Bob", age: 30 } }
Depending on patch order, different final states emerge.
Сейчас я:
  • Отслеживаю очередь локальных операций
  • Сохраняю номера версий для каждого документа
  • Перебазирую удаленные исправления поверх локальных неподтвержденных исправлений
Однако это ломается, когда патчи изменяют родительские пути уже измененных дочерних путей.
Я хочу избежать использования полной структуры CRDT без крайней необходимости из-за размера и сложности пакета.

Подробнее здесь: https://stackoverflow.com/questions/798 ... on-patch-s
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»