$30 off During Our Annual Pro Sale. View Details »

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. View Slide

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

    View Slide

  3. Содержание
    1 ⎮
    Почему и как мы сделали еще один
    редактор текста?
    2 ⎮ Confict-free replicated data types и
    Operational transformation
    3 ⎮ Сетевой транспорт
    4 ⎮ Хранилище

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. =5
    http://research.microsoft.com/users/lamport/pubs/time-clocks.pdf
    Лэсли Лэмпорт. Логические часы.
    “Time, clocks, and the ordering of events in a distributed system”. - 1978.

    View Slide

  13. Operational transformation
    =6
    Google docs, sharedb
    Трудно реализовать! Зависимость от центрального сервера.

    View Slide

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

    View Slide

  15. Conflict-free replicated data types (CRDT)
    =8
    https://www.youtube.com/watch?v=B5NULPSiOGw
    Мартин Клеппман.
    «CRDTs and the Quest for Distributed Consistency». - QCon, 2018.

    View Slide

  16. CRDT для JSON
    =9
    https://arxiv.org/abs/1608.03960
    Мартин Клеппман.
    «A Conflict-Free Replicated JSON Datatype». - 2016.
    https://github.com/automerge/automerge

    View Slide

  17. CRDT для текста
    =10
    https://hal.inria.fr/inria-00445975/document
    Mark Shapiro.
    Logoot (2009) → Treedoc (2010) → LSEQ (2013)

    View Slide

  18. =11
    〉Сборка мусора
    〉Жадно потребляют память
    〉Простая реализация
    〉Формально доказаны
    〉Не нужен «главный участник»
    〉Github Atom, RIAK, Facebook,
    Redis
    〉Хрупкие
    〉Некоторые не сходятся
    〉Google docs, sharedb (derbyjs)
    CRDT
    OT

    View Slide

  19. =12
    Commutative replicated data types
    D = op1
    + op2
    = op2
    + op1
    Коммутативность!

    View Slide

  20. Treedoc
    =13
    https://hal.inria.fr/inria-00445975/document
    Алиса Боб

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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)

    View Slide

  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)

    View Slide

  32. =14
    Алиса

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    Postgresql
    S3 API
    Хранилища

    View Slide

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

    Postgresql
    S3 API
    Хранилища

    View Slide

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

    Postgresql
    S3 API
    Хранилища
    DE1
    1

    View Slide

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

    Postgresql
    S3 API
    Хранилища
    DE1
    1
    DB
    1
    Боб
    Шина

    View Slide

  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
    ]

    View Slide

  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
    ]

    View Slide

  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
    ]

    View Slide

  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
    ]

    View Slide

  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
    ]

    View Slide

  45. Спасибо!
    Антон Чапоргин
    Из РоссииКоннекта с Дельтой
    [email protected]
    @chaporgin

    View Slide