← Все статьи

28 апреля 2026 · 12 мин чтения Разработка

Почему мы выбрали CRDT, а не OT для совместного редактирования

Прошлой осенью мы стояли перед выбором алгоритма для real-time collaboration в заметках. Operational Transformation выглядел проще на первый взгляд. CRDT — теоретически элегантнее. Спойлер: явного победителя не было, но кейс склонил нас к CRDT.

Контекст задачи

В FocusWork заметки — это богатый Markdown с inline-задачами, mentions, checklists. Несколько человек могут одновременно редактировать одну заметку. Нужна устойчивость к offline-edit'ам и реалистичный merge без потери данных.

Кратко: что такое OT и CRDT

Operational Transformation (OT)

Изобретено в Google Wave/Docs. Идея: каждая операция (insert "x" at pos 5) при доставке на другой клиент трансформируется относительно операций которые этот клиент уже применил. Все клиенты в итоге сходятся к одинаковому состоянию.

CRDT (Conflict-Free Replicated Data Types)

Альтернативный подход. Структура данных проектируется так что merge — коммутативная операция. Не важно в каком порядке применяются операции — результат одинаковый. Не требуется central server для координации.

Сравнение по критериям

КритерийOTCRDT
Простота имплементацииСложная (особенно текст с tombstones)Средняя
Нужен central server?Да (для упорядочивания)Нет
Размер данныхМалБольше (метаданные)
Offline-firstСложноИз коробки
ПроизводительностьO(n) операцииO(log n) с хорошей структурой
Корректность доказанаТолько для конкретных алгоритмовФормально (по теории)

Что нас зацепило в CRDT

Главное — offline-first архитектура без хака. Юзер пишет заметку в самолёте, потом приходит онлайн, мы синкаем — никаких "rebase" / "resolve conflicts" не требуется. С OT для этого нужен либо снапшотинг и replay, либо очень аккуратный server-side merging.

Также CRDT идеально ложится на нашу архитектуру "одно дерево событий". У нас уже было event-sourcing для других сущностей (задачи, проекты). CRDT-операции для текста встроились как ещё один тип событий в том же потоке.

Что было неприятно

Технический выбор: какой CRDT

Мы посмотрели на несколько вариантов:

Выбрали Yjs. Главные причины:

  1. Нативная интеграция с ProseMirror (наш richtext-editor)
  2. Бенчмарки на нашем профиле нагрузки — 3-4× быстрее Automerge
  3. Уже используется в продах типа JupyterLab, Discourse, Maxapp

Цифры по результату

После 4 месяцев с Yjs в проде:

Если бы выбирали сегодня

Всё равно CRDT. Возможно посмотрели бы серьёзнее на diamond-types за perf, но Yjs — отличный workhorse и community огромное.

OT же отлично подходит когда у вас есть гарантированный central authoritative server и не нужен полноценный offline. Для Google Docs это работает прекрасно. Для нас с offline-first и P2P-перспективой — нет.

— Инженерная команда FocusWork