System Design Space
Граф знанийНастройки

Обновлено: 22 июня 2026 г. в 08:59

Фронтенд-кейс: коллаборативный редактор в стиле Google Docs

сложный

Практический фронтенд-кейс: коллаборативный редактор в стиле Google Docs, синхронизация в реальном времени, OT/CRDT, офлайн-режим, повторное подключение, конфликты и UX при сетевых сбоях.

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

Глава показывает, как синхронизация в реальном времени, разрешение конфликтов, локальное состояние, сетевые сбои и понятный UX сцеплены друг с другом. Здесь особенно видно, насколько сильно поведение фронтенда зависит от модели согласованности и протокола взаимодействия.

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

Практическая польза главы

Практика проектирования

Переводите требования совместного редактирования в решения о локальном буфере, канале синхронизации, разрешении конфликтов и отдельном канале присутствия.

Качество решений

Оценивайте архитектуру по задержке ввода, сохранности правок, поведению при повторном подключении и способности объяснить пользователю статус изменений.

Аргументация на интервью

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

Формулировка компромиссов

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

Контекст

Зачем нужна архитектура фронтенда

Коллаборативный редактор показывает, где фронтенд становится участником распределённой системы, а не только слоем отображения.

Открыть главу

Коллаборативный редактор в стиле Google Docs требует быстрой локальной реакции, корректной общей версии документа и понятного поведения при сетевых сбоях. Главная сложность не в том, чтобы отправить текст по постоянному соединению, а в том, чтобы сохранить намерение пользователя, когда несколько людей редактируют документ одновременно.

Задача и контекст

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

Карта совместного редактирования

Коллаборативный редактор живёт между локальной скоростью и общей версией документа. Переключайте сценарии, чтобы увидеть путь операции, конфликт, офлайн-буфер и отдельный канал присутствия.

ПотокРедакторЛокальная модельБуферКаналДвижокХранилище

Где живут документ, операции и присутствие

Клиент держит локальную модель и буфер, канал синхронизации доставляет операции, а серверная часть подтверждает общую версию документа.

1

UI

Редактор документа

Пользователь видит текст, курсоры других участников, статус сохранения и локальные изменения.

2
↓ меняет

Клиент

Локальная модель документа

Браузер применяет правку сразу, чтобы ввод не зависел от задержки сети.

3
↓ кладёт в

Очередь

Буфер операций

Неподтверждённые правки ждут ACK, повторной отправки или переноса на новую версию.

4
↓ отправляет

Связь

Канал синхронизации

WebSocket или WebTransport доставляет операции, подтверждения и служебные события.

5
↓ проверяет

Сервер

Движок совместной работы

Движок проверяет версию, применяет OT/CRDT-правила и рассылает результат участникам.

6
↓ фиксирует

История

Хранилище состояния

Снимки состояния и журнал операций позволяют восстановить документ и догнать отставших клиентов.

Архитектурный смысл

Главная граница

  • Клиент отвечает за быстрый ввод, но не является источником истины для общей версии.
  • Документные операции и сигналы присутствия лучше вести разными потоками.
  • Хранилище должно уметь восстановить документ без полного проигрывания бесконечной истории.
Схема помогает отделить UX локального редактирования от серверного контура согласования и хранения истории.

Функциональные требования

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

Нефункциональные требования

  • Удалённая правка должна появляться у других участников почти сразу — ориентир для обычного изменения до 200 мс. За этим порогом совместное редактирование перестаёт ощущаться живым.
  • Система должна переживать , всплески повторных подключений и временную потерю канала без потери пользовательского ввода.
  • История правок хранится как и , чтобы документ можно было восстановить и отладить.
  • Архитектура должна масштабироваться по числу активных документов, участников в одном документе и частоте операций.

Оценка масштаба

Активные документы

5 млн+/день

Большинство документов небольшие, но отдельные рабочие сессии могут собирать много участников и частых правок.

Одновременные редакторы

1-50 обычно, до 200 в пике

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

Поток операций

10-50 тыс. операций/с глобально

Основная нагрузка приходит от документных операций, подтверждений и сигналов .

Всплеск повторных подключений

до x3 базовой нагрузки

После локального сетевого сбоя клиенты одновременно отправляют накопленные операции и запрашивают пропущенные изменения.

Связано

Консистентность и идемпотентность

Совместное редактирование напрямую зависит от модели согласованности, дедупликации и обработки повторов операций.

Открыть главу

Архитектура совместного редактирования

Шлюз реального времени

Держит устойчивые соединения по или WebTransport, маршрутизирует документные операции, подтверждения и события присутствия между клиентами и серверной частью.

Движок совместного редактирования

Применяет или , проверяет , сериализует операции и рассылает подтверждённый результат участникам.

Хранилище состояния документа

Хранит текущий снимок, и данные для , чтобы ускорить загрузку и расследование ошибок.

Модуль синхронизации клиента

Управляет локальным буфером, отслеживает , выполняет и показывает пользователю понятный статус сохранения.

Глубокие разборы

или

проще встроить в централизованный серверный контур. лучше подходит для автономных и peer-to-peer-сценариев, но увеличивает .

Порядок операций и причинность

Сервер не должен полагаться на локальное время устройства. Ему нужны версия документа, и, в сложных случаях, , чтобы объяснимо упорядочить конкурентные правки.

Синхронизация после работы без сети

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

Разделение документа и присутствия

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

Компромиссы

Сильная серверная координация упрощает согласованность, но повышает зависимость от .

Полный журнал операций помогает аудиту и отладке, но увеличивает стоимость хранения и .

Частые снимки ускоряют восстановление, но создают и усложняют политику хранения.

экономит , но усложняет диагностику конфликтов и инцидентов.

Источники

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки