- PVSM.RU - https://www.pvsm.ru -

Большинство коммерческих решений ориентированы на клиент-серверный подход ввиду предоставляемого им более детального контроля. Так что и мы в этой статье разберём проектирование сервиса с использованием именно клиент-серверной архитектуры.
Использовать HTTP-вызов для отправки каждого символа неэффективно. Поэтому мы задействуем технологию WebSockets, позволяющую снизить накладные издержки и наблюдать вносимые пользователями изменения в реальном времени.
К прочим компонентам относятся серверы сессий, хранящие информацию о сессиях пользователей. С помощью этих серверов мы реализуем управление правами доступа. По сути, у нас также будут присутствовать службы конфигурации, мониторинга, логирования и система «издатель-подписчик». С помощью этих служб мы будем обрабатывать такие процессы, как отслеживание и выбор лидеров в случае сбоев серверов, постановка в очередь задач вроде уведомления пользователей, а также логировать отладочную информацию.

Рис. 1 Подробная схема сервиса для совместного редактирования документов
DIFF, позволяющие сравнивать разные версии документа и определять отличия между ними для восстановления более старых ревизий. .doc или .docx можно конвертировать в .pdf и наоборот. Серверы приложения также отвечают за извлечение признаков для службы автозавершения.
Документ представляет собой набор символов, расположенных в определённом порядке. Каждый символ имеет значение и индекс размещения. В качестве символа может выступать буква, число, возврат каретки (
) или пробел. Индекс представляет позицию символа в упорядоченном списке всех символов.
Задача текстового редактора заключается в выполнении с содержащимися в нём символами таких операций, как insert(), delete(), edit() и многих других. Ниже показан пример документа и выполнения в нём этих операций.

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

Рис. 3 Как изменение двумя пользователями одного и того же символа может привести к конфликту
Удаление одного и того же символа:

Рис. 4 Как удаление одного и того же символа может привести к неожиданным изменениям
Во втором примере показано, что в случае применения двумя пользователями одинаковых операций они не будут выполнены идемпотентно. Поэтому при одновременном редактировании одной и той же части документа двумя и более людьми необходим механизм разрешения конфликтов.
В этом механизме должно быть учтено два аспекта:
Эта техника широко используется для разрешения конфликтов при совместном редактировании текстов без применения блокировки. Если выполняемые разными людьми операции конфликтуют, OT разрешает этот конфликт и передаёт корректное итоговое состояние конечным пользователям, обеспечивая тем самым согласованное представление.
В этом случае разрешение конфликтов происходит за счёт использования в операциях позиционного индекса символов. Описанные выше проблемы эта техника решает за счёт сохранения коммутативности и идемпотентности.

Рис. 5 Пример операционной трансформации
Текстовые редакторы, использующие ОТ, дают согласованные результаты, если соблюдают два свойства:
a произошла до операции b, она выполняется до неё. Описанные выше свойства являются частью модели СС (Causal Сonsistency, причинная согласованность), используемой при совместном редактировании.
При этом у техники операционной трансформации есть два недостатка:
Операционная трансформация представляет собой набор алгоритмов, и её реализация в реальных проектах требует немалых усилий. Например, команде Google Wave для написания алгоритма ОТ потребовалось два года.
Этот принцип был разработал в качестве улучшенной альтернативы ОТ. CRDT (Conflict-free Replicated Data Type) имеет сложную структуру, но при этом является более простым алгоритмом.
Он выполняет условия коммутативности и идемпотентности за счёт применения к каждому символу двух ключевых свойств:
Теперь каждая операция имеет обновлённую структуру данных:

Рис. 6 Упрощённая структура данных CRDT
Свойство SiteID с помощью Value и PositionalIndex уникально идентифицирует область, для которой пользователь запрашивает операцию. При этом значение PositionalIndex может быть представлено дробью, чтобы:
PositionalIndex других символов не изменялся вследствие каких-либо операций.
Пример ниже показывает, что пользователь с идентификатором области 123e4567-e89b-12d3 вставляет символ со значением A в PositionalIndex со значением 1.5. И хотя эта операция добавляет новый символ, позиционный индекс существующих символов сохраняется за счёт использования дробных значений. Таким образом исключается зависимость от последовательности выполнения операций. Как видно из примера, операция insert(), выполненная между O и T, не изменила позицию T.

Рис. 7 Устранение зависимости от порядка выполнения операций
CRDT позволяет обеспечить стабильную согласованность текста у разных пользователей. Даже если некоторые из них в момент внесения правок окажутся офлайн, когда они вернуться в сеть, хранящиеся на их устройствах локальные копии документа будут приведены к единому представлению.
И хотя популярные платформы для онлайн-редактирования документов вроде Google Docs, Etherpad и Firepad используют технику OT, CRDT значительно упростил одновременную работу над общими документами, в том числе повысив её согласованность. В действительности с помощью CRDT можно реализовать бессерверный одноранговый сервис для совместного редактирования текстов.
Примечание: OT и CRDT являются прекрасными техниками для разрешения конфликтов в случае совместного редактирования, но за счёт использования WebSockets мы сможем исключить возникновение конфликтов в принципе. Как? Эта технология позволяет нам выделять в документе курсор активного участника, видимый всем остальным. В итоге другие редактирующие этот документ пользователи смогут видеть, в какой области происходит работа, и избегать внесения в неё параллельных правок.
Мы разобрали две техники, с помощью которых можно добиться стабильной согласованности при разрешении конфликтов редактирования: операционная трансформация (ОТ) и бесконфликтные реплицируемые типы данных (CRDT). Помимо этого, база данных временных рядов позволяет нам сохранять последовательность происходящих событий. После разрешения конфликта с помощью ОТ или CRDT итоговый результат сохраняется в этой базе данных. Таким образом мы достигаем согласованности между отдельными операциями.
Нам также нужно сохранять согласованность документа между разными серверами датацентра. Для одновременного копирования и обновления его состояния в одном датацентре можно использовать одноранговые протоколы вроде Gossip. И такая стратегия повысит не только согласованность, но и доступность.
Наш дизайн обеспечивает доступность за счёт использования реплик документа, отслеживание которых вместе с основным сервером мы реализуем с помощью сервисов мониторинга. При этом сам процесс реплицирования управляется посредством таких ключевых компонентов, как очередь операций и хранилища данных.
В добавок ко всему, наши WebSocket-серверы могут подключать пользователей к серверам, обслуживающим сессии, которые, в свою очередь, будут определять, работает ли пользователь с документом. Наконец, мы задействуем службы кэширования и CDN (Content Delivery Network, сеть доставки содержимого) для повышения доступности в случае сбоев.
За счёт использования архитектуры микросервисов мы с лёгкостью сможем масштабировать отдельные компоненты, если вдруг число запросов в очереди операций начнёт превышать ёмкость какого-либо из них. В этом случае каждая очередь операций будет связана с одним документом. Мы можем перенаправлять операции, запрошенные разными пользователями, связанными с одним документом, в отдельную очередь. В итоге число созданных очередей будет равно количеству активных документов. Таким образом мы реализуем горизонтальное масштабирование.
Автор: Дмитрий Брайт
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/google-docs/388850
Ссылки в тексте:
[1] Источник: https://habr.com/ru/companies/ruvds/articles/780356/?utm_source=habrahabr&utm_medium=rss&utm_campaign=780356
Нажмите здесь для печати.