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

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

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

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

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 06, 2019
Tweet

Transcript

  1. None
  2. Редактор текста на CRDT в продакшене Антон Чапоргин, руководитель группы

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

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

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

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

    встреч документация, заявки, и другое Отказоустойчивость Курсор, выделение Совместная работа Плеер истории Вики-разметка Простая поддержка Отсутствие багов!
  12. =5 http://research.microsoft.com/users/lamport/pubs/time-clocks.pdf Лэсли Лэмпорт. Логические часы. “Time, clocks, and the

    ordering of events in a distributed system”. - 1978.
  13. Operational transformation =6 Google docs, sharedb Трудно реализовать! Зависимость от

    центрального сервера.
  14. Conflict-free replicated data types (CRDT) =7 https://hal.inria.fr/inria-00609399v1/document 〉счетчик, целочисленный вектор

    〉растущее множество, 〉растущий список 〉направленный граф 〉Treedoc 〉и другие
  15. Conflict-free replicated data types (CRDT) =8 https://www.youtube.com/watch?v=B5NULPSiOGw Мартин Клеппман. «CRDTs

    and the Quest for Distributed Consistency». - QCon, 2018.
  16. CRDT для JSON =9 https://arxiv.org/abs/1608.03960 Мартин Клеппман. «A Conflict-Free Replicated

    JSON Datatype». - 2016. https://github.com/automerge/automerge
  17. CRDT для текста =10 https://hal.inria.fr/inria-00445975/document Mark Shapiro. Logoot (2009) →

    Treedoc (2010) → LSEQ (2013)
  18. =11 〉Сборка мусора 〉Жадно потребляют память 〉Простая реализация 〉Формально доказаны

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

    = op2 + op1 Коммутативность!
  20. Treedoc =13 https://hal.inria.fr/inria-00445975/document Алиса Боб

  21. Treedoc =13 https://hal.inria.fr/inria-00445975/document Алиса Боб (31) (42)

  22. Treedoc =13 https://hal.inria.fr/inria-00445975/document Алиса Боб o (31) (42)

  23. Treedoc =13 https://hal.inria.fr/inria-00445975/document o Алиса Боб o (31) (42)

  24. Treedoc =13 https://hal.inria.fr/inria-00445975/document o Алиса Боб o bo (31) (42)

  25. Treedoc =13 https://hal.inria.fr/inria-00445975/document o b 0 Алиса Боб o bo

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

    bobr (31) (42)
  27. b r 1 Treedoc =13 https://hal.inria.fr/inria-00445975/document o b 0 Алиса

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

    Боб o bo bobr bot (31) (42)
  29. t 1 b r 1 Treedoc =13 https://hal.inria.fr/inria-00445975/document o b

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

    0 ☠ ☠ Алиса Боб o bo bobr bot borat (31) (42)
  31. 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)
  32. =14 Алиса

  33. =14 Алиса Роутеры

  34. =14 Алиса Роутеры Инстансы редакторов {DE1 1 , DE1 2

    , . . . , DE1 n1 } E1
  35. =14 Алиса Роутеры Инстансы редакторов {DE1 1 , DE1 2

    , . . . , DE1 n1 } E1 E2 E3 …
  36. =14 Алиса Роутеры Инстансы редакторов {DE1 1 , DE1 2

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

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

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

    DE1 2 , . . . , DE1 n1 } E1 E2 E3 … Postgresql S3 API Хранилища DE1 1 DB 1 Боб Шина
  40. 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 ]
  41. 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 ]
  42. 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 ]
  43. 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 ]
  44. 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 ]
  45. Спасибо! Антон Чапоргин Из РоссииКоннекта с Дельтой chapson@yandex-team.ru @chaporgin