Google Docs / Collab Editor
PremiumGoogle Docs / Figma collaborative editor system design case. WebSocket gateway + per-doc session actor with CRDT merge, sharded op log (Spanner), snapshot service to blob storage, Redis presence, ACL, comments, version history, Kafka fan-out for hot docs. 5 scenarios: keystroke, concurrent edit at same anchor (CRDT merge), offline edit + sync, presence cursors, hot doc with snapshot + version restore. 2 ADRs: OT vs CRDT (pick CRDT), server-authoritative vs P2P CRDT (pick server-authoritative).
Что внутри
Совместное редактирование документов
Realtime transport не решает задачу совместного редактирования сам по себе. Нужны проверенная модель convergence, durable acknowledgement, fenced session ownership, корректная offline sync, authorization revocation и контролируемый fan-out. Схема использует централизованный session actor и opaque updates реальной CRDT-библиотеки; она не изобретает новый текстовый алгоритм.
Что именно синхронизируется
Client хранит локальную CRDT replica и обменивается binary updates/state vectors. Для Yjs update contract коммутативен, ассоциативен и идемпотентен: порядок и повторная доставка не меняют итог при корректном применении библиотеки.
Псевдокод вида insert(position=42, char, replica_id) недостаточен:
- position 42 меняется после конкурентных вставок и удалений;
- lexicographic sort IDs не определяет все sequence/delete semantics;
- tombstone/GC, causality и nested structures остаются без доказательства;
- «одинаковый oplog order» не заменяет convergence contract.
Production выбирает зрелую реализацию, тестирует randomized convergence и хранит её protocol version. Server не разбирает update как произвольный JS и не считает самодельную структуру CRDT.
Durable edit path
- WebSocket gateway проверяет attach token и текущий ACL.
- Session router находит fenced owner документа.
- Actor подтверждает lease epoch и повторно проверяет write permission.
- Update с
update_idзаписывается в durable log. - Только после durable append клиент получает ACK.
- Actor группирует subscribers по gateway и создаёт delivery tasks.
- Delivery workers вызывают owning WebSocket gateway; только он пишет в socket.
Broadcast actor → browser, обходящий WebSocket gateway, был бы ложным shortcut: actor не владеет пользовательским соединением и не применяет его backpressure, auth и disconnect state.
Stable update_id закрывает ambiguous ACK. Если actor упал после append, но до
ACK/broadcast, retry не создаёт второе изменение, а replacement actor повторно
доставляет уже committed update.
Полный разбор, ADR-ы, сценарии и deep dives — после оплаты бандла.
System Design Cases
Полный доступ ко всем кейсам бандла
Premium открывает полный разбор для подготовки к интервью
- Где архитектура ломается первой и как защищать выбранный дизайн.
- Конкретный capacity math: размеры данных, throughput и пороги масштабирования.
- Trade-off-ы в стиле ADR, которые легко превращаются в структурированный ответ.
- Запускаемые сценарии: happy path, отказы, retry и recovery.
Регистрация бесплатна. Оплата — следующим шагом, из этого же кейса.
Уже есть аккаунт?