Совместное редактирование в реальном времени - как это работает? - PullRequest
60 голосов
/ 23 февраля 2011

Я пишу приложение, в котором я хотел бы иметь возможности совместного редактирования документов в реальном времени (очень похоже на редактирование в стиле Google Documents).

Я знаю, как отслеживатьпозиции курсора, это просто.Просто опрашивайте сервер каждые полсекунды или секунды с текущим идентификатором пользователя, именем файла, номером строки и номером строки, которые могут быть сохранены в базе данных, и возвращаемое значение этого запроса опроса является позицией курсоров другого пользователя.

Что я не знаю, как это сделать, так это обновить документ таким образом, чтобы он не отбрасывал курсор и не вызывал полную перезагрузку, поскольку это было бы слишком медленным для моих целей.

Это действительно должно работать только в Google Chrome, предпочтительно Firefox.Мне не нужно поддерживать какой-либо другой браузер.

Ответы [ 7 ]

45 голосов
/ 23 февраля 2011

Алгоритм, используемый за кулисами для объединения совместных изменений из нескольких узлов, называется операционное преобразование .Это не просто реализовать.

См. Также этот вопрос для полезных ссылок.

13 голосов
/ 03 марта 2011

Вам не нужно xmpp или wave для этого обязательно.Большая часть работы над реализацией с открытым исходным кодом под названием infinote уже была проделана с jinfinote (https://github.com/sveith/jinfinote). Jinfinote недавно также был портирован на python (https://github.com/phrearch/py-infinote) для централизованной обработки параллелизма и состояния документа. В настоящее время я использую оба впроект hwios (https://github.com/phrearch/hwios),, который опирается на веб-сокеты и транспорт json. Вы действительно не хотите использовать опрос для такого рода приложений. Также xmpp, кажется, излишне усложняет imo.

12 голосов
/ 21 февраля 2017

Совместное редактирование в режиме реального времени требует нескольких вещей, чтобы быть эффективным.Большинство других ответов здесь сосредоточены только на одном аспекте проблемы;а именно распределенное состояние (он же shared-mutable-state).Операционное преобразование (OT), бесконфликтные реплицируемые типы данных (CRDT), дифференциальная синхронизация и другие связанные технологии - все это подходы к достижению распределенного состояния почти в реальном времени.Большинство фокусируется на возможной согласованности, которая допускает временные расхождения каждого из состояний участников, но гарантирует, что каждое состояние участников в конечном итоге сходится при остановке редактирования.В других ответах упоминалось несколько реализаций этих технологий.

Однако, как только вы поделились изменяемым состоянием, вам потребуется несколько других функций, чтобы обеспечить разумный пользовательский опыт.Примеры этих дополнительных концепций включают в себя:

  • Идентичность : Кто те люди, с которыми вы сотрудничаете.
  • Присутствие : Кто в настоящее время«Здесь» редактирование с вами сейчас.
  • Связь : чат, аудио, видео и т. д., которые позволяют пользователям координировать действия
  • Совместная работа Cueing: функции, которые указывают на то, что другие участники делают и / или собираются сделать.

Общие курсоры и выборки являются примерами Collaborative Cueing (также известной как Collaboration Awareness).Они помогают пользователям понять намерения и вероятные последующие действия других участников.Оригинальный постер частично спрашивал о взаимодействии между общим изменяемым состоянием и совместной репликой.Это важно, потому что расположение курсора или выделения в документе обычно описывается через местоположения в документе.Проблема в том, что расположение курсора (например) зависит от контекста документа.Когда я говорю, что мой курсор имеет индекс 37, это означает, что в документе, на который я смотрю, находится символ 37.Документ, который вы можете иметь прямо сейчас, может отличаться от моего из-за ваших правок или изменений других пользователей, и поэтому индекс 37 в вашем документе может быть неправильным.

Таким образом, механизм, который вы используете для распределения местоположений курсорадолжен быть каким-то образом интегрирован в механизм системы или, по крайней мере, знать о механизме, обеспечивающем одновременное управление общим изменяемым состоянием.Сегодня одной из проблем является то, что, хотя существует множество OT / CRDT, двунаправленных сообщений, чатов и других библиотек, они представляют собой изолированные решения, которые не являются интегрированными.Это затрудняет создание системы конечного пользователя, обеспечивающей хороший пользовательский опыт и часто приводящей к техническим трудностям, оставленным разработчику на усмотрение.

В конечном счете, для реализации эффективной системы совместного редактирования в реальном времени вынеобходимо учитывать все эти аспекты;и мы даже не обсуждали историю, авторизацию, разрешение конфликтов на уровне приложений и многие другие аспекты.Вы должны создать или найти технологии, которые поддерживают каждую из этих концепций таким образом, чтобы это имело смысл для вашего варианта использования.Затем вы должны интегрировать их.

Хорошая новость заключается в том, что приложения, поддерживающие совместное редактирование, становятся все более популярными.Технологии, которые поддерживают их создание, становятся зрелыми, и новые становятся доступными каждый месяц. Firebase было одним из первых решений, которое попыталось объединить многие из этих концепций в простой в использовании API.Новичок Convergence (полное описание, я являюсь основателем Convergence Labs), предоставляет универсальный API, который поддерживает большинство из этих аспектов совместного редактирования и может значительно сократить время, затраты,и сложность создания приложений для совместного редактирования в реальном времени.

6 голосов
/ 03 июня 2013

После ответа на этот вопрос и более тщательного поиска, я думаю, что лучшим автономным приложением для проверки будет Etherpad , которое работает как приложение браузера JS и использует Node.js на стороне сервера.,Эта технология известна как операционное преобразование .

Изначально Etherpad был довольно тяжеловесным приложением, которое было куплено Google и встроено в Google Wave, что не удалось.Код был выпущен как открытый исходный код, а технология была переписана на Javascript для Etherpad Lite, теперь переименованной просто в «Etherpad».Некоторые из технологий Etherpad, вероятно, также были включены в Документы Google.

Начиная с Etherpad, были различные версии этой технологии, в частности некоторые библиотеки Javascript, которые позволяют интегрировать ее непосредственно в ваше веб-приложение:

Я являюсь сопровождающим meteor-sharejs пакет для добавления редакторов в реальном времени непосредственно в приложение Meteor , которое, по моему мнению, является лучшим из обоих миров:)

3 голосов
/ 23 февраля 2011

Как указал Гинтаутас, это делается Оперативным Преобразованием.Насколько я понимаю, основная часть исследований и разработок этой функции была выполнена в рамках ныне несуществующего проекта Google Wave и известна как Wave Protocol.К счастью, Google Wave с открытым исходным кодом, так что вы можете получить несколько хороших примеров кода на http://code.google.com/p/wave-protocol/

2 голосов
/ 23 февраля 2011

Команда Google Docs провела небольшое исследование на примере того, как работала совместная работа в реальном времени, но я не могу найти запись в блоге.

На странице википедии есть кое-что приличное: http://en.wikipedia.org/wiki/Collaborative_real-time_editor

0 голосов
/ 23 мая 2017

Я недавно опубликовал репозиторий с рабочим примером того, что вы пытаетесь достичь:

https://quill -sharedb-cursors.herokuapp.com

Он основан на ShareDB (OT), работающем как бэкэнд, и Quill редакторе форматированного текста на внешнем интерфейсе.

В основном просто соединяем все эти вещи с еще кодом для рисования курсоров . Код должен быть достаточно простым для понимания и копирования в любое конкретное решение.

Надеюсь, это поможет в работе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...