Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2019. Антон Чапоргин (Яндекс) — Редактор текста на CRDT в продакшене

CodeFest
April 06, 2019

CodeFest 2019. Антон Чапоргин (Яндекс) — Редактор текста на CRDT в продакшене

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

У нас есть много контент-сервисов для разных нужд: записи логов встреч, проведения собеседований и другие. Требовалось сделать один встраиваемый редактор текста для всех этих сервисов. При постановке требований обсуждали много параметров, выбирая между plain text и wysiwyg. Обсуждали будущие характеристики масштабируемости, отказоустойчивости, встраиваемости, языки для реализации, сетевой транспорт (от webrtc до лонгполлинга на сервис-воркерах), окно ввода и, конечно, алгоритм. Мы рассмотрели несколько реализаций Conflict free Replicated Data Types и Operational transformation, сделали два прототипа и реализовали один из них.

CodeFest

April 06, 2019
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. Содержание 1 ⎮ Почему и как мы сделали еще один

    редактор текста? 2 ⎮ Confict-free replicated data types и Operational transformation 3 ⎮ Сетевой транспорт 4 ⎮ Хранилище
  2. Почему мы начали проект? =4 code.yandex-team.ru epad.yandex-team.ru wiki.yandex.ru собеседования логи

    встреч документация, заявки, и другое Плеер истории
  3. Почему мы начали проект? =4 code.yandex-team.ru epad.yandex-team.ru wiki.yandex.ru собеседования логи

    встреч документация, заявки, и другое Плеер истории Простая поддержка
  4. Почему мы начали проект? =4 code.yandex-team.ru epad.yandex-team.ru wiki.yandex.ru собеседования логи

    встреч документация, заявки, и другое Курсор, выделение Плеер истории Простая поддержка
  5. Почему мы начали проект? =4 code.yandex-team.ru epad.yandex-team.ru wiki.yandex.ru собеседования логи

    встреч документация, заявки, и другое Курсор, выделение Плеер истории Простая поддержка Отсутствие багов!
  6. Почему мы начали проект? =4 code.yandex-team.ru epad.yandex-team.ru wiki.yandex.ru собеседования логи

    встреч документация, заявки, и другое Отказоустойчивость Курсор, выделение Плеер истории Простая поддержка Отсутствие багов!
  7. Почему мы начали проект? =4 code.yandex-team.ru epad.yandex-team.ru wiki.yandex.ru собеседования логи

    встреч документация, заявки, и другое Отказоустойчивость Курсор, выделение Совместная работа Плеер истории Простая поддержка Отсутствие багов!
  8. Почему мы начали проект? =4 code.yandex-team.ru epad.yandex-team.ru wiki.yandex.ru собеседования логи

    встреч документация, заявки, и другое Отказоустойчивость Курсор, выделение Совместная работа Плеер истории Вики-разметка Простая поддержка Отсутствие багов!
  9. Conflict-free replicated data types (CRDT) =7 https://hal.inria.fr/inria-00609399v1/document 〉счетчик, целочисленный вектор

    〉растущее множество, 〉растущий список 〉направленный граф 〉Treedoc 〉и другие
  10. =11 〉Сборка мусора 〉Жадно потребляют память 〉Простая реализация 〉Формально доказаны

    〉Не нужен «главный участник» 〉Github Atom, RIAK, Facebook, Redis 〉Хрупкие 〉Некоторые не сходятся 〉Google docs, sharedb (derbyjs) CRDT OT
  11. =12 Commutative replicated data types D = op1 + op2

    = op2 + op1 Коммутативность!
  12. t 1 b r 1 Treedoc =13 https://hal.inria.fr/inria-00445975/document o b

    0 ☠ ☠ Алиса Боб o bo bobr bot (31) (42)
  13. t 1 b r 1 Treedoc =13 https://hal.inria.fr/inria-00445975/document o b

    0 ☠ ☠ Алиса Боб o bo bobr bot borat (31) (42)
  14. r a 0 5 6 t 1 b r 1

    Treedoc =13 https://hal.inria.fr/inria-00445975/document o b 0 ☠ ☠ Алиса Боб o bo bobr bot borat (31) (42)
  15. =14 Алиса Роутеры Инстансы редакторов {DE1 1 , DE1 2

    , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища
  16. DA 1 =14 Алиса Роутеры Инстансы редакторов {DE1 1 ,

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища
  17. DA 1 =14 Алиса Роутеры Инстансы редакторов {DE1 1 ,

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища DE1 1
  18. DA 1 =14 Алиса Роутеры Инстансы редакторов {DE1 1 ,

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища DE1 1 DB 1 Боб Шина
  19. DA 1 =14 Алиса Роутеры Инстансы редакторов {DE1 1 ,

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища DE1 1 DB 1 Боб Шина web socket Транспорт [OpD1 1 , OpD1 2 ]
  20. DA 1 =14 Алиса Роутеры Инстансы редакторов {DE1 1 ,

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища Операции DE1 1 DB 1 Боб Шина web socket Транспорт [OpD1 1 , OpD1 2 ]
  21. DA 1 =14 Алиса Роутеры Инстансы редакторов {DE1 1 ,

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища Операции DE1 1 Снепшоты DB 1 Боб Шина web socket Транспорт [OpD1 1 , OpD1 2 ]
  22. DA 1 =14 Алиса Роутеры Инстансы редакторов {DE1 1 ,

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища Операции DE1 1 Снепшоты Другие сервисы DB 1 Боб Шина web socket Транспорт [OpD1 1 , OpD1 2 ]
  23. DA 1 =14 Алиса Роутеры Инстансы редакторов {DE1 1 ,

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища Операции DE1 1 Снепшоты Другие сервисы Права доступа DB 1 Боб Шина web socket Транспорт [OpD1 1 , OpD1 2 ]