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

Как и зачем мы сделали своё чат-решение?

Как и зачем мы сделали своё чат-решение?

Мое выступление на конференции CrossConf 09-10 сентября 2022 года. Я рассказываю о том как мы сделали свою омниканальную чат-платформу.

https://www.youtube.com/watch?v=rlgPOJdWgJY

Denis Anikin

May 16, 2023
Tweet

More Decks by Denis Anikin

Other Decks in Programming

Transcript

  1. {
    Денис Аникин
    https://xfenix.ru
    Как и зачем мы
    сделали своё чат-
    решение?

    View Slide

  2. Денис Аникин
    2
    Кто я такой:
    — работаю в Райффайзен банке
    https://xfenix.ru

    View Slide

  3. Денис Аникин
    3
    Кто я такой:
    — работаю в Райффайзен банке
    — team lead в команде Chat
    https://xfenix.ru

    View Slide

  4. Денис Аникин
    4
    Кто я такой:
    — работаю в Райффайзен банке
    — team lead в команде Chat
    — community lead в Python Community
    https://xfenix.ru

    View Slide

  5. Денис Аникин
    5
    Кто я такой:
    — работаю в Райффайзен банке
    — team lead в команде Chat
    — community lead в Python Community
    — fullstack: разрабатываю на back на python и front
    на typescript, занимаюсь devops
    https://xfenix.ru

    View Slide

  6. Тем, кто делает свои решения, связанные с
    чатами
    Кому будет полезна презентация?
    6
    1

    View Slide

  7. Тем, кто делает свои решения, связанные с
    чатами
    Кому будет полезна презентация?
    7
    1
    Тем, кто делает решения,
    связанные с websocket
    2

    View Slide

  8. Тем, кто делает свои решения, связанные с
    чатами
    Кому будет полезна презентация?
    8
    1
    Тем, кто делает решения,
    связанные с websocket
    2
    Тем, кто пишет или хочет писать на python
    3

    View Slide

  9. Тем, кто делает свои решения, связанные с
    чатами
    Кому будет полезна презентация?
    9
    1
    Тем, кто делает решения,
    связанные с websocket
    2
    Тем, кто пишет или хочет писать на python
    3
    Тем, кто работает с микросервисной
    архитектурой
    4

    View Slide

  10. 5
    Тем, кто делает свои решения, связанные с
    чатами
    Кому будет полезна презентация?
    10
    1
    Людям, которым интересны кейсы успешной
    продуктовой разработки
    Тем, кто делает решения,
    связанные с websocket
    2
    Тем, кто пишет или хочет писать на python
    3
    Тем, кто работает с микросервисной
    архитектурой
    4

    View Slide

  11. 5
    Тем, кто делает свои решения, связанные с
    чатами
    Кому будет полезна презентация?
    11
    1
    Людям, которым интересны кейсы успешной
    продуктовой разработки
    Тем, кто делает решения,
    связанные с websocket
    2
    Тем, кто выбирает стек для проектов
    6
    Тем, кто пишет или хочет писать на python
    3
    Тем, кто работает с микросервисной
    архитектурой
    4

    View Slide

  12. 5
    Тем, кто делает свои решения, связанные с
    чатами
    Кому будет полезна презентация?
    12
    1
    Людям, которым интересны кейсы успешной
    продуктовой разработки
    Тем, кто делает решения,
    связанные с websocket
    2
    Тем, кто выбирает стек для проектов
    6
    Тем, кто пишет или хочет писать на python
    3
    Тем, кто работает с микросервисной
    архитектурой
    4
    Тем, кому интересны лайфхаки из продакшена
    7

    View Slide

  13. Что делает наша
    система?
    13

    View Slide

  14. 14
    Наша система
    Чат-решение
    WA
    TG
    Моб. приложения
    Веб

    Операторы

    View Slide

  15. Что было не так с
    решением до этого?
    15

    View Slide

  16. Расскажу о том, что было
    16
    — Это «коробка»
    Поговорим о плюсах

    View Slide

  17. Расскажу о том, что было
    17
    — Это «коробка»
    — Омниканальность и все необходимые функции в наличи
    Поговорим о плюсах

    View Slide

  18. Расскажу о том, что было
    18
    — Это «коробка»
    — Омниканальность и все необходимые функции в наличи
    — Есть админка: РМО (рабочее место оператора), РМГ/РМС
    (рабочее место главного специалиста/супервизора)
    Поговорим о плюсах

    View Slide

  19. А теперь о минусах
    19
    И это не для всех будет так
    — Абонентская плата

    View Slide

  20. А теперь о минусах
    20
    И это не для всех будет так
    — Абонентская плата
    — Производительность

    View Slide

  21. А теперь о минусах
    21
    И это не для всех будет так
    — Абонентская плата
    — Производительность
    — Безопасность

    View Slide

  22. А теперь о минусах
    22
    И это не для всех будет так
    — Абонентская плата
    — Производительность
    — Безопасность
    — Качество

    View Slide

  23. Что не так с доработками?
    23
    — Разработка велась медленно и непредсказуемо
    — Доработки нередко могли попадать в основную систему и к
    конкурентам
    К сожалению, в крупной системе без них никак

    View Slide

  24. Производительность
    24
    Самое сложное
    Внутри системы
    находилось ядро на python
    2.7
    Не использовалась
    нативная асинхронность
    Система не поддерживала
    масштабирование вообще
    (никакое!)

    View Slide

  25. В чём проблема с асинхронность?
    25
    Ответ запутанный — это GIL

    View Slide

  26. В чём проблема с асинхронность?
    26
    Ответ запутанный — это GIL

    View Slide

  27. А что с масштабированием?
    27
    Вот это самое печальное
    — Не вертикальное
    — Не горизонтальное

    — Никакое!

    View Slide

  28. Архитектура
    28

    View Slide

  29. View Slide

  30. 30
    Ключевые технологии

    View Slide

  31. 31
    Ключевые технологии
    Кстати, есть ещё dragonfly и
    skytable

    View Slide

  32. View Slide

  33. Почему keydb?
    33

    View Slide

  34. Настройка кластера
    34
    Про HA
    — у нас 3 реплики

    View Slide

  35. Настройка кластера
    35
    Про HA
    — у нас 3 реплики
    — а так же 3 sentinel

    View Slide

  36. Настройка кластера
    36
    Про HA
    — у нас 3 реплики
    — а так же 3 sentinel
    — всё ради HA и быстрого failover

    View Slide

  37. Настройка кластера
    37
    Про HA
    — у нас 3 реплики
    — а так же 3 sentinel
    — всё ради HA и быстрого failover
    — мы не используем
    шардирование

    View Slide

  38. View Slide

  39. Лайфхак из продакшена #1
    39
    Супер важно
    Вам необходимо мониторить количество коннекшенов

    View Slide

  40. Лайфхак из продакшена #1
    40
    Супер важно
    Вам необходимо мониторить количество коннекшенов

    View Slide

  41. Лайфхак из продакшена #2
    41
    Ещё важнее
    — Вам необходим пулинг соединений со стороны приложений

    View Slide

  42. Лайфхак из продакшена #2
    42
    Ещё важнее
    — Вам необходим пулинг соединений со стороны приложений
    — Наиболее это важно для высококонкурентных приложений:
    асинхронных, например, или полагающихся на green threads

    View Slide

  43. Лайфхак из продакшена #2
    43
    Ещё важнее
    — Вам необходим пулинг соединений со стороны приложений
    — Наиболее это важно для высококонкурентных приложений:
    асинхронных, например, или полагающихся на green threads
    — Вам может понадобится ограничивать concurrency со
    стороны приложения

    View Slide

  44. View Slide

  45. Почему docker &
    kubernetes?
    45

    View Slide

  46. 46
    Ну в конце концов 2022 год на дворе…

    View Slide

  47. Почему Kubernetes?
    47
    И мы выбираем подход «оркестрация»
    (не будем о «хореографии»)
    У нас > 1 машины

    View Slide

  48. Почему Kubernetes?
    48
    И мы выбираем подход «оркестрация»
    (не будем о «хореографии»)
    У нас > 1 машины
    ReplicaSet, HPA и еще несколько
    концепций — и мы в дамках
    Нам нужно
    масштабирование

    View Slide

  49. Почему Kubernetes?
    49
    И мы выбираем подход «оркестрация»
    (не будем о «хореографии»)
    У нас > 1 машины
    ReplicaSet, HPA и еще несколько
    концепций — и мы в дамках
    Нам нужно
    масштабирование
    Здесь на помощь спешит control loop,
    probes, service mesh и много всего
    разного
    Нам нужна надежность

    View Slide

  50. Почему Kubernetes?
    50
    И мы выбираем подход «оркестрация»
    (не будем о «хореографии»)
    У нас > 1 машины
    ReplicaSet, HPA и еще несколько
    концепций — и мы в дамках
    Нам нужно
    масштабирование
    Здесь на помощь спешит control loop,
    probes, service mesh и много всего
    разного
    Нам нужна надежность
    Разработчики сами описывают то как их
    сервисы работают в продакшене
    Мы желаем удобства
    разработчикам

    View Slide

  51. Почему Kubernetes?
    51
    И мы выбираем подход «оркестрация»
    (не будем о «хореографии»)
    У нас > 1 машины
    ReplicaSet, HPA и еще несколько
    концепций — и мы в дамках
    Нам нужно
    масштабирование
    Здесь на помощь спешит control loop,
    probes, service mesh и много всего
    разного
    Нам нужна надежность
    Разработчики сами описывают то как их
    сервисы работают в продакшене
    Мы желаем удобства
    разработчикам
    Никаких больше тонн баш скриптов,
    разбросанных по компьютерам и
    запрятанных под мастрас ансибл
    плейбуков
    Мы хотим IAC

    View Slide

  52. Почему Kubernetes?
    52
    И мы выбираем подход «оркестрация»
    (не будем о «хореографии»)
    У нас > 1 машины
    ReplicaSet, HPA и еще несколько
    концепций — и мы в дамках
    Нам нужно
    масштабирование
    Здесь на помощь спешит control loop,
    probes, service mesh и много всего
    разного
    Нам нужна надежность
    Разработчики сами описывают то как их
    сервисы работают в продакшене
    Мы желаем удобства
    разработчикам
    Никаких больше тонн баш скриптов,
    разбросанных по компьютерам и
    запрятанных под мастрас ансибл
    плейбуков
    Мы хотим IAC
    Техника, которую довольно трудно
    реализовывать руками, здесь нам
    достается вообще бесплатно!
    Rolling update

    View Slide

  53. Почему python?
    53

    View Slide

  54. Сложно объяснить…

    View Slide

  55. Давайте о плюсах Python
    55
    Нас интересует версия 3 конечно
    Асинхронность из коробки
    1

    View Slide

  56. Давайте о плюсах Python
    56
    Нас интересует версия 3 конечно
    Асинхронность из коробки
    1
    Динамическая типизация == разработка
    очень быстрая
    2

    View Slide

  57. Давайте о плюсах Python
    57
    Нас интересует версия 3 конечно
    Асинхронность из коробки
    1
    Динамическая типизация == разработка
    очень быстрая
    2
    Аннотации типов устраняют проблемы
    предыдущего пункта
    3

    View Slide

  58. Давайте о плюсах Python
    58
    Нас интересует версия 3 конечно
    Асинхронность из коробки
    1
    Динамическая типизация == разработка
    очень быстрая
    2
    Аннотации типов устраняют проблемы
    предыдущего пункта
    3
    Язык #1 по куче рейтингов
    4

    View Slide

  59. Давайте о плюсах Python
    59
    Нас интересует версия 3 конечно
    Асинхронность из коробки
    1
    Динамическая типизация == разработка
    очень быстрая
    2
    Аннотации типов устраняют проблемы
    предыдущего пункта
    3
    Язык #1 по куче рейтингов
    4
    Производительности хватает на приличную
    нагрузку + язык серьезно ускоряется
    5

    View Slide

  60. Давайте о плюсах Python
    60
    Нас интересует версия 3 конечно
    Асинхронность из коробки
    1
    Динамическая типизация == разработка
    очень быстрая
    2
    Аннотации типов устраняют проблемы
    предыдущего пункта
    3
    Язык #1 по куче рейтингов
    4
    Производительности хватает на приличную
    нагрузку + язык серьезно ускоряется
    5
    Есть миллион готовых библиотек
    6

    View Slide

  61. View Slide

  62. View Slide

  63. Выводы по Python
    63
    Мое спорное мнение
    Python — первый язык, с
    которого вы можете
    начать любой бекенд

    View Slide

  64. Выводы по Python
    64
    Мое спорное мнение
    Python — первый язык, с
    которого вы можете
    начать любой бекенд
    Когда вам не хватает его
    скорости, вы берете go,
    java/kotlin или rust

    View Slide

  65. Kafka
    65

    View Slide

  66. Её плюсы
    66
    Всё из-за её архитектуры
    Потрясющая скорость

    View Slide

  67. Её плюсы
    67
    Всё из-за её архитектуры
    Потрясющая скорость
    Наши сообщения надежно хранятся и
    доставляются
    Отменная надежность,
    масштабирование

    View Slide

  68. Её плюсы
    68
    Всё из-за её архитектуры
    Потрясющая скорость
    Наши сообщения надежно хранятся и
    доставляются
    Отменная надежность,
    масштабирование
    Это одно из самых важных
    Гарантия порядка
    доставки

    View Slide

  69. Про производительность
    69
    — Нам действительно важно сочетание масштабирования и
    гарантии порядка доставки

    View Slide

  70. Про производительность
    70
    — Нам действительно важно сочетание масштабирования и
    гарантии порядка доставки
    — Нам действительно важно держать много RPS в купе с low
    latency

    View Slide

  71. Некоторые минусы
    71
    Изучить кафку непросто
    Высокая сложность
    Почему, возможно, вы не захотите у себя иметь кафку

    View Slide

  72. Некоторые минусы
    72
    Изучить кафку непросто
    Высокая сложность
    По сравнению с, например, RabbitMQ у
    нас здесь просто распределенный лог
    Не очень много
    возможностей
    Почему, возможно, вы не захотите у себя иметь кафку

    View Slide

  73. Лайфхак из продакшена #1
    73
    Супер важно
    Обязательно необходимо мониторить topic lag

    View Slide

  74. Лайфхак из продакшена #1
    74
    Супер важно
    Обязательно необходимо мониторить topic lag

    View Slide

  75. Лайфхак из продакшена #2
    75
    Тоже важно
    — Вам понадобится поддерживать dead letter

    View Slide

  76. Лайфхак из продакшена #2
    76
    Тоже важно
    — Вам понадобится поддерживать dead letter
    — Вам понадбится поддерживать dead letter + timeout + retry

    View Slide

  77. Немного о вебсокетах
    77

    View Slide

  78. Про сам протокол
    78
    Его плюсы
    — Нативно асинхронен

    View Slide

  79. Про сам протокол
    79
    Его плюсы
    — Нативно асинхронен
    — Реализован под все платформы

    View Slide

  80. Про сам протокол
    80
    Его плюсы
    — Нативно асинхронен
    — Реализован под все платформы
    — Быстр

    View Slide

  81. Про сам протокол
    81
    Минусы
    — Непривычная семантика для тех, кто всю жизнь с HTTP

    View Slide

  82. Про сам протокол
    82
    Минусы
    — Непривычная семантика для тех, кто всю жизнь с HTTP
    — Нет ничего, протокол очень примитивный, все приходится
    делать самим

    View Slide

  83. Про сам протокол
    83
    Минусы
    — Непривычная семантика для тех, кто всю жизнь с HTTP
    — Нет ничего, протокол очень примитивный, все приходится
    делать самим
    — Есть конкурент в лице SSE

    View Slide

  84. Про сам протокол
    84
    Минусы
    — Непривычная семантика для тех, кто всю жизнь с HTTP
    — Нет ничего, протокол очень примитивный, все приходится
    делать самим
    — Есть конкурент в лице SSE
    — По мнению некоторых уже много лет не нужен в силу пункта
    выше

    View Slide

  85. Про сам протокол
    85
    Минусы
    — Непривычная семантика для тех, кто всю жизнь с HTTP
    — Нет ничего, протокол очень примитивный, все приходится
    делать самим
    — Есть конкурент в лице SSE
    — По мнению некоторых уже много лет не нужен в силу пункта
    выше
    — Много вопросов с аутентификацией

    View Slide

  86. Про сам протокол
    86
    Минусы
    — Непривычная семантика для тех, кто всю жизнь с HTTP
    — Нет ничего, протокол очень примитивный, все приходится
    делать самим
    — Есть конкурент в лице SSE
    — По мнению некоторых уже много лет не нужен в силу пункта
    выше
    — Много вопросов с аутентификацией
    — Если «сессия» истекла, надо рвать соединение

    View Slide

  87. Про сам протокол
    87
    Минусы
    — Непривычная семантика для тех, кто всю жизнь с HTTP
    — Нет ничего, протокол очень примитивный, все приходится
    делать самим
    — Есть конкурент в лице SSE
    — По мнению некоторых уже много лет не нужен в силу пункта
    выше
    — Много вопросов с аутентификацией
    — Если «сессия» истекла, надо рвать соединение
    — Кто-то должен держать пул соединений

    View Slide

  88. Двусторонний роутинг
    88
    Мы решали эту проблему
    Мы берем сообщение снаружи и кидаем
    в кафку
    Когда мы «пушим» в
    систему, всё просто

    View Slide

  89. Двусторонний роутинг
    89
    Мы решали эту проблему
    Мы берем сообщение снаружи и кидаем
    в кафку
    Когда мы «пушим» в
    систему, всё просто
    Вот это совсем непросто и готовых
    решений в интернете нет
    Но как попасть
    «обратно»?

    View Slide

  90. Двусторонний роутинг
    90
    Мы решали эту проблему
    Мы берем сообщение снаружи и кидаем
    в кафку
    Когда мы «пушим» в
    систему, всё просто
    Вот это совсем непросто и готовых
    решений в интернете нет
    Но как попасть
    «обратно»?
    Выступление на moscow python conf ++
    2021
    Ответ есть в нашем
    докладе

    View Slide

  91. И в заключение чего
    достигли
    91

    View Slide

  92. Подводим итоги
    92
    Мы достигли следующего:
    Дизайн в общем для
    банка стиле

    View Slide

  93. Подводим итоги
    93
    Мы достигли следующего:
    Дизайн в общем для
    банка стиле
    Горизонтальное
    масштабирование

    View Slide

  94. Подводим итоги
    94
    Мы достигли следующего:
    Дизайн в общем для
    банка стиле
    Горизонтальное
    масштабирование
    Отказоустойчивость

    View Slide

  95. Подводим итоги
    95
    Мы достигли следующего:
    Дизайн в общем для
    банка стиле
    Горизонтальное
    масштабирование
    Отказоустойчивость
    Полный контроль над
    своей системой

    View Slide

  96. Подводим итоги
    96
    Мы достигли следующего:
    Дизайн в общем для
    банка стиле
    Горизонтальное
    масштабирование
    Отказоустойчивость
    Полный контроль над
    своей системой
    Предсказуемая
    скорость разработки

    View Slide

  97. Подводим итоги
    97
    Мы достигли следующего:
    Дизайн в общем для
    банка стиле
    Горизонтальное
    масштабирование
    Отказоустойчивость
    Полный контроль над
    своей системой
    Предсказуемая
    скорость разработки
    Безопасность

    View Slide

  98. /
    Спасибо
    98
    Денис Аникин
    https://xfenix.ru/

    View Slide