Зачем нам нужна Операционная трансформация для совместной работы в реальном времени?
Увидев такие приложения, как Google Docs и библиотеки, такие как ShareJS и EtherPad Lite, я очень рад совместной работе в реальном времени, и это, кажется, реализуется с использованием очень сложной техники, известной как Операционное преобразование.
Мой вопрос, возможно, несколько странный: зачем нужна ОТ?
Я имею в виду, что в большинстве настроек у нас очень низкая задержка в Интернете - благодаря таким инструментам, как Google Docs, ShareJS и EtherPad, изменения почти мгновенно отражаются на подключенных клиентах.
Почему невероятно сложное решение для разрешения конфликтов и синхронизации данных на стороне сервера?
Будучи знаком с шаблоном команды и отменить / повторить, мне кажется, гораздо более простым решением было бы просто реализовать каждое изменение в документе как команду с эквивалентной командой отмены.
Позвольте клиентам отправлять сериализованные команды, когда они вносят изменения. Присвойте серийный номер на стороне сервера каждой полученной команде. Распространите все команды, примененные к документу, обратно клиентам, которые также ведут историю команд.
Каждый подключенный клиент получает обратно от сервера все команды, примененные к документу, теперь с серийными номерами, указывающими "правильный" порядок, например порядок, в котором команды были получены сервером, и в котором они были применены к основному документу. удерживается сервером.
Если клиент находился под командой № 100 и отправляет новую команду на сервер, который возвращается под номером 102, клиент знает, что он пропустил команду - тогда он просто применяет команды "отменить" к последней отправленной им команде, применяет команда номер 101, а затем снова применяет свою собственную команду номер 102, упорядочив тем самым порядок вещей.
Если он отстает от нескольких команд, он просто откатывается по мере необходимости, затем применяет все пропущенные команды и т. Д.
Это звучит гораздо проще для меня.
Чем лучше Операционная Трансформация?