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

Как отпилить часть монолита и завернуть ее в Go-микросервис – Павел Лакосников

Как отпилить часть монолита и завернуть ее в Go-микросервис – Павел Лакосников

GopherCon Russia

April 13, 2019
Tweet

More Decks by GopherCon Russia

Other Decks in Programming

Transcript

  1. Для чего Авито микросервисы - Долго и трудно тестировать* -

    Сложный и большой поток изменений* - Долго деплоить и откатывать* - Высокая связность кода и большие издержки времени при разработке* + Легче протестировать* + Малое количество единовременных изменений* + Быстро деплоить и откатывать* + Меньшая связность* Монолит Микросервис 2
  2. • Генерация sessionID — уникального cookie посетителя • Привязка sessionID

    к UserID • Хранение данных, связанных непосредственно с сессией !6
  3. • 528 млн ключей в Redis кластере • 200 гигабайт

    данных • 400к RPS операций с данными !7
  4. Почему не JWT !8 • Легаси приложений • Желание держать

    единый способ авторизации • Возможность управления выписанными сессиями
  5. Зависимости сервиса сессий 1. PostgreSQL • Хранение refresh-tokens • Хранение

    истории • Триггеры, хранимые процедуры, вложенные подзапросы 20 2. Redis • Хранение основных данных 3. Другие сервисы • Сервис пользователей • Шина данных
  6. !25 Модуляризация !25 Исследование бизнес-логики Модуляризация Написание сервиса Развязка внешних

    зависимостей Переключение нагрузки Окончательный вынос из монолита
  7. •Отдельный модуль, содержащий логику микросервиса •Модуль подключен к монолиту как

    внешняя библиотека •Монолит отрефакторен под использование интерфейса модуля 38
  8. Пишем сам сервис !39 Исследование бизнес-логики Модуляризация Написание сервиса Развязка

    внешних зависимостей Переключение нагрузки Окончательный вынос из монолита
  9. Не забывать про то, что сервис на GO •Memory-кеш •Удобные

    Goroutines •Асинхронность •Пулы коннектов •Добавляем Circuit Breaker 40
  10. Метрики 42 • Memory • CPU • Тротлинг • Рестарты

    реплик • Общая нагрузка в разрезе потребителя
  11. Метрики 43 • RPS в разрезе методов и кодов •

    Server ResponseTime • Client ResponceTime • Состояние пулов коннектов • ErrorRate и ResponceTime при работе с хранилищами • Объемы сохраняемых данных
  12. Промежуточная схема сервиса сессий !45 Сервис Другие сервисы Монолит session

    service База Монолита Redis storage Redis кеш Шина данных Сервис пользователей База Сервис События авторизации Репликация Запись Чтение
  13. Итоговая схема сервиса сессий !46 Сервис Другие сервисы session service

    Redis storage Redis кеш Шина данных Сервис пользователей База Сервис События авторизации Чтение и запись
  14. Трудности •Структура хранилища не готова к выносу •Триггеры, хранимые процедуры

    базы, view, подзапросы и join’ы •Сильно денормализованный способ хранения данных сервиса •Постоянная REALTIME нагрузка •Сложность в переключении 48
  15. Трюки •Работа над инкапсуляцией данных сервиса в одном месте •Сервис

    использует отдельного пользователя с доступом только в нужные таблицы при работе с монолитом •Используем кеш 49
  16. Запрос на запись Клиент Сервис База сервиса База монолита Ответ

    200 Репликация Создать id 123 Сохранение в базу Прочитать id 123 Чтение id 123 Ответ 404 !52
  17. Запрос на запись Клиент Сервис База сервиса База монолита Ответ

    200 Репликация Создать id 123 Сохранение в базу Прочитать id 123 Чтение id 123 Ответ 200 Кеш Сохранили Запись в кеш !53
  18. •Микросервис с публичным API, совпадающий с модулем •Без живой нагрузки

    •Использующий две базы (свою и базу монолита) 55
  19. Даём нагрузку на сервис !56 Исследование бизнес-логики Модуляризация Написание сервиса

    Развязка внешних зависимостей Переключение нагрузки Окончательный вынос из монолита
  20. !58

  21. Окончательный вынос из монолита !64 Исследование бизнес-логики Модуляризация Написание сервиса

    Развязка внешних зависимостей Переключение нагрузки Окончательный вынос из монолита
  22. Промежуточная схема сервиса сессий !65 Сервис Другие сервисы Монолит session

    service База Монолита Redis storage Redis кеш Шина данных Сервис пользователей База Сервис События авторизации Репликация Запись Чтение
  23. Итоговая схема сервиса сессий !66 Сервис Другие сервисы session service

    Redis storage Redis кеш Шина данных Сервис пользователей База Сервис События авторизации Чтение и запись
  24. •Пишем в свою базу в сервисе вместо монолита •Удаляем из

    базы монолита неиспользуемые сущности •Удаляем модуль из монолита 67
  25. !68

  26. Что в итоге получилось !69 !69 !69 !69 Исследование бизнес-логики

    Модуляризация Написание сервиса Развязка внешних зависимостей Переключение нагрузки Окончательный вынос из монолита
  27. Что хорошо •Покрытие тестами подняли до 90% •Оптимизировали сериализацию данных

    •Ускорили всех потребителей •Получили возможность масштабироваться независимо от монолита 70
  28. Что плохо • Сервис-мейкер теперь немножко девопс • Неоднократно в

    процессе выноса сервис падал • Бесшовная выкатка — это трудно 71