Проблемы, возникающие при отсутствии службы совместного редактирования документов.
Приведенный выше сценарий — один из примеров, который приводит к потере времени и разочарованию, когда пользователи работают над документом, обмениваясь файлами друг с другом. Некоторые преимущества использования онлайн-сервиса редактирования документов вместо настольного приложения заключаются в следующем:
Проблемы, возникающие при отсутствии службы совместного редактирования документов.
Приведенный выше сценарий — один из примеров, который приводит к потере времени и разочарованию, когда пользователи работают над документом, обмениваясь файлами друг с другом.
Для решения вышеописанной проблемы мы можем использовать онлайн-сервис совместного редактирования документов. Некоторые преимущества использования онлайн-сервиса редактирования документов вместо настольного приложения заключаются в следующем:
Пользователи могут просматривать и комментировать документ во время его редактирования. Для получения новейших функций не требуется специальных аппаратных характеристик. Достаточно машины, на которой можно запустить браузер. Можно работать из любого места. В отличие от локальных настольных редакторов, пользователи могут просматривать долгосрочную историю документа и при необходимости восстановить старую версию. Помимо ЦУБ Калуд, популярными сервисами онлайн-редактирования являются Google Docs, Etherpad, Microsoft Office 365, Slite и многие другие.
Проектирование Служба совместного редактирования документов может быть разработана двумя способами:
Он может быть разработан как централизованный объект, использующий архитектуру клиент-сервер для предоставления услуги редактирования документов всем пользователям. Он может быть разработан с использованием технологии peer-to-peer для совместной работы над одним документом. Большинство коммерческих решений ориентированы на архитектуру клиент-сервер, чтобы иметь более тонкий контроль. Поэтому мы сосредоточимся на проектировании сервиса с использованием архитектуры клиент-сервис. Давайте посмотрим, как мы будем продвигаться в этой главе.
ребования к дизайну B6 Cloud
Давайте рассмотрим функциональные и нефункциональные требования к проектированию службы совместного редактирования.
Функциональные требования Ниже перечислены действия, которые пользователь сможет выполнять с помощью нашего сервиса совместного редактирования документов:
Совместная работа над документом: Несколько пользователей должны иметь возможность редактировать документ одновременно. Кроме того, большое количество пользователей должно иметь возможность просматривать документ.Разрешение конфликтов: Система должна передавать правки, сделанные одним пользователем, всем остальным участникам совместной работы. Система также должна разрешать конфликты между пользователями, если они редактируют одну и ту же часть документа.
Предложения: Пользователь должен получать предложения по заполнению часто используемых слов, фраз и ключевых слов в документе, а также предложения по исправлению грамматических ошибок.
Количество просмотров: Редакторы документа должны иметь возможность видеть количество просмотров документа.История: Пользователь должен иметь возможность видеть историю совместной работы над документом.Редактор реальных документов также должен обладать такими функциями, как создание, удаление документов и управление доступом пользователей. Мы сосредоточились на основных функциях, перечисленных выше, но в последующих уроках мы также обсудим возможность использования других функций.
Функциональные и нефункциональные требования к сервису совместного редактирования Нефункциональные требования Задержка: Разные пользователи могут быть подключены для совместной работы над одним и тем же документом. Поддержание низкой задержки является сложной задачей для пользователей, подключенных из разных регионов.Согласованность: Система должна уметь разрешать конфликты между пользователями, одновременно редактирующими документ, тем самым обеспечивая согласованное представление документа. В то же время пользователи в разных регионах должны видеть обновленное состояние документа. Поддержание согласованности важно для пользователей, подключенных как к одной, так и к разным зонам.Доступность: Сервис должен быть доступен в любое время и демонстрировать устойчивость к сбоям.Масштабируемость: Большое количество пользователей должно иметь возможность пользоваться услугой одновременно. Они могут либо просматривать один и тот же документ, либо создавать новые документы. Оценка ресурсов Давайте сделаем некоторые оценки ресурсов, основываясь на следующих предположениях:
Мы предполагаем, что существует 80 миллионов ежедневных активных пользователей (DAU). Максимальное количество пользователей, которые могут одновременно редактировать документ, равно 20. Размер текстового документа составляет 100 КБ. Тридцать процентов всех документов содержат изображения, и только 2% документов содержат видео. Общий объем памяти, необходимый для хранения изображений в документе, составляет 800 КБ, в то время как каждое видео занимает 3 МБ. Пользователь создает один документ за один день. Основываясь на этих предположениях, мы сделаем следующие оценки.
Оценка объема хранилища Учитывая, что каждый пользователь может создать один документ в день, в общей сложности каждый день создается 80 миллионов документов. Ниже мы оцениваем объем хранилища, необходимого для одного дня:
Примечание: Мы можем корректировать значения в таблице ниже, чтобы увидеть, как изменится оценка потребности в хранении.
Estimation for Storage Requirements
Объем памяти, необходимый для совместного редактирования документов в режиме онлайн, в день
Общее хранилище, необходимое для одного дня, выглядит следующим образом: 8+19,2+4,8=32 ТБ в день
Примечание: Хотя в наших функциональных требованиях указано, что мы должны вести историю документов, мы не включили требования к хранению исторических данных для краткости.
Оценка пропускной способности Входящий трафик: Если предположить, что в сеть службы совместного редактирования загружается 32 ТБ данных в день, то потребность сети во входящем трафике будет следующей:
Исходящий трафик: Чтобы оценить пропускную способность исходящего трафика, мы предположим количество документов, просматриваемых пользователем каждый день. Будем считать, что типичный пользователь просматривает пять документов в день. Тогда применим следующие расчеты:
Примечание: Мы можем изменять значения в таблице ниже, чтобы увидеть, как меняются расчеты.
Смотрите подробные расчеты
Суммирование требований к пропускной способности
Примечание: Общая требуемая пропускная способность равна сумме входящего и исходящего трафика. =3+14.7≈18 Гбит/с приблизительно.
Суммирование требований к пропускной способности
Примечание: Общая требуемая пропускная способность равна сумме входящего и исходящего трафика. =3+14.7≈18 Гбит/с приблизительно.
Оценка количества серверов Предположим, что один пользователь способен генерировать 100 запросов в день. Учитывая количество ежедневных активных пользователей, количество запросов в секунду (RPS) будет следующим:
100×80M = 8000M / 86400 = 92,6 тыс/сек.
RPS не является достаточной информацией для подсчета количества серверов. Мы будем использовать следующее приближение для подсчета количества серверов.
Чтобы оценить количество серверов, необходимых для выполнения запросов 80 миллионов пользователей, мы просто делим количество пользователей на количество запросов, которые может обработать сервер. Мы предполагаем, что наш эталонный сервер может обрабатывать 8 000 запросов в секунду. Таким образом, мы видим следующее:
Неформально, уравнение выше предполагает, что один сервер может обслуживать 8 000 пользователей.
Компоненты, которые мы будем использовать При проектировании службы совместного редактирования документов мы будем использовать следующие компоненты.
Балансировщики нагрузки будут первой точкой контакта для пользователей.Базы данных будут необходимы для хранения нескольких вещей, включая текстовый контент, историю документов, данные пользователей и т.д. Для этих целей нам могут понадобиться различные типы баз данных.Системы Pub-sub могут выполнять задачи, которые не могут быть выполнены сразу. В нашем проекте мы будем выполнять ряд задач асинхронно. Поэтому мы будем использовать систему pub-sub.Кэширование поможет нам улучшить производительность нашего проекта.Blob storage будет хранить большие файлы, такие как изображения и видео.Система очередей будет ставить в очередь операции редактирования, запрашиваемые разными пользователями. Поскольку многие запросы на редактирование не могут быть выполнены одновременно, мы должны временно поместить их в очередь.CDN может хранить часто используемые мультимедийные данные в документе. Мы также можем поместить в CDN документы только для чтения, которые часто запрашиваются.Дизайн Мы выполним нашу разработку в два этапа. На первом этапе мы объясним различные компоненты и строительные блоки, а также причину их выбора в нашем проекте. На втором этапе мы опишем, как мы выполняем различные функциональные требования, изобразив рабочий процесс.
Компоненты Мы использовали следующий набор компонентов для завершения нашего проекта:
API-шлюз: Различные клиентские запросы будут перехватываться через шлюз API. В зависимости от запроса можно переслать один запрос нескольким компонентам, отклонить запрос или ответить мгновенно, используя уже кэшированный ответ, и все это через шлюз API. Запросы на редактирование, комментарии к документу, уведомления, аутентификация и запросы на хранение данных — все они проходят через шлюз API.Серверы приложений: Серверы приложений выполняют бизнес-логику и задачи, которые обычно требуют вычислительной мощности. Например, некоторые документы могут преобразовываться из одного типа файлов в другой (например, из PDF в документ Word) или поддерживать такие функции, как импорт и экспорт. Они также играют центральную роль в сборе атрибутов для рекомендательного механизма.Хранилища данных: Для выполнения наших требований будут использоваться различные хранилища данных. Мы будем использовать реляционную базу данных для сохранения информации о пользователях и информации о документах для наложения ограничений на привилегии. Мы можем использовать NoSQL для хранения комментариев пользователей для более быстрого доступа. Для сохранения истории редактирования документов мы можем использовать базу данных временных рядов. Для хранения видео и изображений внутри документа мы будем использовать blob-хранилище. Наконец, мы можем использовать распределенный кэш, например Redis, и CDN, чтобы обеспечить конечным пользователям хорошую производительность. Мы используем Redis специально для хранения различных структур данных, включая пользовательские сессии, функции для сервиса typeahead и часто используемые документы. CDN хранит часто используемые документы и тяжелые объекты, такие как изображения и видео.Очередь обработки: Поскольку редактирование документов требует частой отправки на сервер данных небольшого размера (обычно символов), неплохо поставить эти данные в очередь для периодической пакетной обработки. Мы будем добавлять символы, изображения, видео и комментарии в очередь обработки. Использование HTTP-вызова для отправки каждого незначительного символа неэффективно. Поэтому мы будем использовать WebSockets, чтобы снизить накладные расходы и наблюдать за изменениями документа в реальном времени разными пользователями.Другие компоненты: Другие компоненты включают серверы сеансов, которые хранят информацию о сеансе пользователя. Мы будем управлять привилегиями доступа к документу через серверы сессий. По сути, это будут также службы конфигурации, мониторинга, pub-sub и протоколирования, которые будут решать такие задачи, как мониторинг и выбор лидеров в случае сбоев сервера, постановка в очередь задач, таких как уведомления пользователей, и протоколирование отладочной информации.На рисунке ниже показано, как различные компоненты координируются
Рабочий процесс В следующих шагах мы объясним, как будут обрабатываться различные запросы после того, как они достигнут шлюза API:
Совместное редактирование и разрешение конфликтов: Каждый запрос направляется в очередь операций. Именно здесь разрешаются конфликты между различными участниками совместной работы над одним и тем же документом. Если конфликтов нет, данные собираются в пакет и хранятся в базе данных временных рядов с помощью серверов сессий. Такие данные, как видео и изображения, сжимаются для оптимизации хранения, а символы обрабатываются сразу.История: С помощью базы данных временных рядов можно восстановить различные версии документа. Различные версии можно сравнивать с помощью операций DIFF, которые сравнивают версии и выявляют различия для восстановления более старых версий одного и того же документа. Асинхронные операции: Уведомления, электронные письма, подсчет просмотров и комментарии — это асинхронные операции, которые могут быть поставлены в очередь через компонент pub-sub, например Kafka. Шлюз API генерирует эти запросы и направляет их в модуль pub-sub. Пользователи, обменивающиеся документами, могут генерировать уведомления с помощью этого процесса.Предложения: Предложения представлены в виде сервиса typeahead, который предлагает автозаполнение предложений по обычно используемым словам и фразам. Служба typeahead также может извлекать атрибуты и ключевые слова из документа и предоставлять предложения пользователю. Поскольку количество слов может быть большим, мы будем использовать для этой цели базу данных NoSQL. Кроме того, наиболее часто используемые слова и фразы будут храниться в кэширующей системе типа Redis.Импорт и экспорт документов: Серверы приложений выполняют ряд важных задач, включая импорт и экспорт документов. Серверы приложений также конвертируют документы из одного формата в другой. Например, документ в формате .doc или .docx может быть преобразован в .pdf или наоборот. Серверы приложений также отвечают за извлечение признаков для службы typeahead.Примечание: Использование WebSockets ускоряет общую производительность и позволяет нам облегчить общение между пользователями, работающими над одним и тем же документом. Если объединить WebSockets с Redis-подобным кэшем, можно разработать эффективную функцию чата.
Параллельность при совместном редактировании Мы обсудили дизайн службы совместного редактирования документов, но не рассмотрели, как мы будем работать с одновременным внесением изменений в документ разными пользователями. Однако прежде чем обсуждать вопросы параллелизма, нам необходимо понять, что такое совместное редактирование текста.
Что такое редактор документов? Документ — это композиция символов, расположенных в определенном порядке. Каждый символ имеет значение и позиционный индекс. Символ может быть буквой, цифрой, символом ввода (↵) или пробелом. Индекс представляет собой позицию символа в упорядоченном списке символов.
Работа редактора текста или документа заключается в выполнении таких операций, как вставка(), удаление(), редактирование() и т.д. над символами в документе. Ниже показано изображение документа и то, как редактор будет выполнять эти операции.
Проблемы параллелизма Совместная работа разных пользователей над одним и тем же документом может привести к проблемам параллелизма. Конфликты могут возникнуть, когда несколько пользователей редактируют одну и ту же часть документа. Поскольку у пользователей есть локальная копия документа, окончательное состояние документа на сервере может отличаться от того, что пользователи видят на своем компьютере. После того как сервер выложит обновленную версию, пользователи обнаружат неожиданный результат.
Пример 1 Рассмотрим сценарий, в котором два пользователя хотят добавить несколько символов в один и тот же позиционный индекс. Ниже мы показали, как два пользователя, изменяющие одно и то же предложение, могут привести к противоречивым результатам:
Как показано выше, два пользователя пытаются изменить одно и то же предложение «Образовательный от разработчиков». Оба пользователя выполняют insert() по индексу 10. Возможны следующие два варианта:
Фраза «for developers» перезаписывает «platform». Это приводит к результату «for developers». Фраза «platform» перекрывает «for developers.» «. Это приводит к результату «platformlopers». Этот пример показывает, что операции, применяемые в другом порядке, не обладают свойством коммутативности.
Пример 2 Рассмотрим еще один простой пример, в котором два пользователя пытаются удалить один и тот же символ из слова. Возьмем слово «EEDUCATIVE». Поскольку в этом слове есть лишняя буква «Е», оба пользователя захотят удалить лишний символ. Ниже мы видим, как может возникнуть неожиданный результат:
Этот второй пример показывает, что разные пользователи, применяющие одну и ту же операцию, не будут идемпотентными. Таким образом, разрешение конфликтов необходимо там, где несколько участников редактируют одну и ту же часть документа одновременно.
Из приведенных выше примеров мы поняли, что решение проблем параллелизма при совместном редактировании должно соответствовать двум правилам:
Коммутативность: Порядок применяемых операций не должен влиять на конечный результат. Идемпотентность: Аналогичные операции, которые были повторены, должны применяться только один раз. Ниже мы приведем две известные техники разрешения конфликтов.
Техники для разрешения конфликтов Давайте обсудим две ведущие технологии, которые используются для разрешения конфликтов в совместном редактировании.
Оперативная трансформация Оперативная трансформация (ОТ) — это техника, которая широко используется для разрешения конфликтов в совместном редактировании. ОТ появилась в 1989 году и совершенствовалась на протяжении многих лет. Это безблокировочный и неблокирующий подход к разрешению конфликтов. Если операции между участниками совместной работы противоречат друг другу, OT разрешает конфликты и передает конечным пользователям правильное состояние конвергенции. В результате OT обеспечивает согласованность для пользователей.
OT выполняет операции с использованием метода позиционного индекса для разрешения конфликтов, таких как те, о которых мы говорили выше. OT решает вышеуказанные проблемы, соблюдая коммутативность и идемпотентность.
Совместные редакторы, основанные на OT, являются согласованными, если они обладают следующими двумя свойствами:
Сохранение причинности: Если операция a произошла до операции b, то операция a выполняется до операции b. Сходимость: Все копии документов на разных клиентах в конечном итоге будут идентичны. Приведенные выше свойства являются частью модели согласованности CC, которая представляет собой модель для поддержания согласованности в совместном редактировании.
OT имеет два недостатка:
Каждая операция над символами может потребовать изменения позиционного индекса. Это означает, что операции зависят друг от друга по порядку. Его сложно разработать и внедрить. Оперативное преобразование представляет собой набор сложных алгоритмов, и его правильная реализация оказалась сложной для реальных приложений. Например, команде Google Wave потребовалось два года, чтобы реализовать алгоритм ОТ.
Модели согласованности в ОТ За прошедшие годы исследовательское сообщество предложило различные модели согласованности. Некоторые из них специфичны для совместного редактирования, другие — для алгоритмов ОТ. Основные модели согласованности следующие:
Модель CC: Как мы определили выше, она включает в себя сохранение причинности и сходимость. Модель CCI: Включает сохранение причинности, конвергенцию и сохранение намерения. Другие модели включают модель CSM (причинность, однооперационные эффекты и многооперационные эффекты) и модель CA (причинность и допустимость).
Предлагаются различные модели согласованности, и обычно новые модели являются надстройками более ранних.
Бесконфликтный реплицированный тип данных (CRDT) Бесконфликтный реплицированный тип данных (CRDT) был разработан в попытке улучшить ОТ. CRDT имеет сложную структуру данных, но упрощенный алгоритм.
CRDT удовлетворяет требованиям коммутативности и идемпотентности, присваивая каждому символу два ключевых свойства:
Каждому символу присваивается глобально уникальный идентификатор.
Он глобально упорядочивает каждый символ.
Каждая операция теперь имеет обновленную структуру данных:
SiteID уникально идентифицирует сайт пользователя, запрашивающего операцию с помощью Value и PositionalIndex. Значение PositionalIndex может быть дробным по двум основным причинам.
PositionalIndex других символов не изменится из-за определенных операций. Будет исключена зависимость порядка операций между разными пользователями. В приведенном ниже примере показано, что пользователь с ID сайта 123e4567-e89b-12d3 вставляет символ со значением A в PositionalIndex, равный 1,5. Хотя добавляется новый символ, позиционные индексы существующих символов сохраняются с использованием дробных индексов. Поэтому зависимость порядка между операциями исключается. Как показано ниже, вставка() между O и T не повлияла на позицию T.Предотвращение зависимости порядка между операциями
Предотвращение зависимости порядка между операциями
CRDT обеспечивают надежную согласованность между пользователями. Даже если некоторые пользователи находятся в автономном режиме, локальные копии конечных пользователей сходятся, когда они возвращаются в сеть.
Хотя такие известные платформы для редактирования документов в Интернете, как Google Docs, Etherpad и Firepad, используют OT, CRDT сделали параллельность и согласованность в совместном редактировании документов легкой задачей. Фактически, с помощью CRDT можно реализовать бессерверную одноранговую службу совместного редактирования документов.
Примечание: OT и CRDTs — хорошие решения для разрешения конфликтов при совместном редактировании, но использование WebSockets позволяет выделить курсор участника совместной работы. Другие пользователи будут предвидеть положение следующей операции участника и, естественно, избегать конфликтов.
Согласованность Мы рассмотрели, как добиться сильной согласованности для разрешения конфликтов в документе с помощью двух технологий: оперативного преобразования (OT) и типов данных бесконфликтного разрешения (CRDT). Кроме того, база данных временных рядов позволяет нам сохранять порядок событий. После того как ОТ или CRDT разрешили все конфликты, конечный результат сохраняется в базе данных. Это помогает нам достичь согласованности в отношении отдельных операций.
Мы также заинтересованы в том, чтобы состояние документа оставалось неизменным на разных серверах в центре обработки данных. Для одновременной репликации обновленного состояния документа в пределах одного центра обработки данных мы можем использовать одноранговые протоколы, такие как протокол Gossip. Эта стратегия не только улучшит согласованность, но и повысит доступность.
Задержка Задержка может показаться проблемой, особенно когда два пользователя удалены друг от друга или от сервера. Однако пользователи поддерживают копии документов на своей стороне, в то время как данные передаются через WebSockets на конечные серверы. Поэтому воспринимаемая пользователем задержка будет низкой. Кроме того, пользователи чаще всего пишут текстовые данные в документах небольшого размера. Поэтому распространение данных между различными серверами в пределах одного объекта и между различными центрами обработки данных или зонами будет осуществляться с низкой задержкой. Кроме того, такие файлы, как видео и изображения, могут храниться в CDN для быстрого обслуживания, поскольку этот контент меняется нечасто.
С практической точки зрения, число читателей и писателей онлайн-документа ограничено. Для читателей задержка не является проблемой, поскольку документ загружается только один раз. Таким образом, большинство читателей можно обслуживать из одного центра обработки данных. Для писателей следует выбрать оптимальную зону в качестве централизованного местоположения между участниками совместной работы над одним и тем же документом. Однако для популярных документов асинхронная репликация будет эффективным методом для достижения хорошей производительности и низкой задержки для большого числа пользователей. В целом, достижение высокой согласованности становится сложной задачей при асинхронной репликации.
Доступность Наш проект обеспечивает доступность за счет использования реплик и мониторинга основного сервера и серверов-реплик с помощью служб мониторинга. Ключевые компоненты, такие как очередь операций и хранилища данных, управляют своей репликацией внутренне.
Поскольку мы используем WebSockets, наши WebSocket-серверы могут соединять пользователей с серверами поддержки сессий, которые определяют, активно ли пользователь просматривает документ или работает над ним. Поэтому наличие нескольких WebSocket-серверов повысит доступность проекта. Наконец, мы используем кэширующие сервисы и CDN для повышения доступности в случае сбоев.
Однако на данный момент мы не разработали схему управления аварийным восстановлением.
Выполнение нефункциональных требований Согласованность Протокол Gossip для репликации операций над документом в пределах одного центра обработки данных Методы параллелизма, такие как OT и CRDTs Использование базы данных временных рядов для поддержания порядка операций Репликация между центрами обработки данных Задержка Асинхронная репликация данных Выбор оптимального местоположения для создания и обслуживания документов Использование CDN для передачи видео и изображений Использование Redis для хранения различных структур данных, включая CRDT Соответствующие базы данных NoSQL для требуемой функциональности Доступность Репликация компонентов для предотвращения SPOFs Использование нескольких серверов WebSocket для пользователей, которые могут периодически отключаться. Изоляция компонентов повышает доступность Внедрение протоколов аварийного восстановления, таких как резервное копирование, репликация в различные зоны и глобальная балансировка нагрузки на серверы. Использование служб мониторинга и конфигурации Масштабируемость Различные хранилища данных для разных целей обеспечивают масштабируемость Горизонтальное разделение RDBMS CDN, способные обрабатывать большое количество запросов для больших файлов Масштабируемость Поскольку мы использовали микросервисную архитектуру, мы можем легко масштабировать каждый компонент по отдельности в случае, если количество запросов в очереди операций превысит ее емкость. Мы можем использовать несколько очередей операций. В этом случае каждая очередь операций будет отвечать за один документ. Мы можем направлять операции, запрашиваемые разными пользователями и связанные с одним документом, в определенную очередь. Количество порожденных очередей будет равно количеству активных документов. В результате мы сможем добиться горизонтальной масштабируемости.