Download - Рефакторинг монолита в микросервисы на Go
Рефакторинг монолита в микросервисы на GoМинкин Андрей
Кто я
• TeamLead в MadDevs.io• Nambataxi.com• Nambafood.kg• Cybernamba.com• Kuppi.kg• Moika.kg• House.kg
Namba Taxi
• 4 года на рынке Бишкека
Namba Taxi
• 4 года на рынке Бишкека• Не менее 8к заказов в сутки
Namba Taxi
• 4 года на рынке Бишкека• Не менее 8к заказов в сутки• 600+ водителей на линии
Namba Taxi
• 4 года на рынке Бишкека• Не менее 8к заказов в сутки• 600+ водителей на линии• 300к довольных клиентов
Namba Taxi
• 4 года на рынке Бишкека• Не менее 8к заказов в сутки• 600+ водителей на линии• 300к довольных клиентов• 300 рпс на серверах
AVG response time
• Водители 20 ms• Операторы 2.5 ms
Что такое такси
Что такое такси
• Клиенты• Водители• Операторы КЦ• Контроль качества• Back office
Как вызвать такси
Как вызвать такси
• Приложение
Как вызвать такси
• Приложение• СМС
Как вызвать такси
• Приложение• СМС• Сайт
Как вызвать такси
• Приложение• СМС• Сайт• IPTV
Как вызвать такси
• Приложение• СМС• Сайт• IPTV• Сторонние приложения (вызов по API)
Как вызвать такси
• Приложение• СМС• Сайт• IPTV• Сторонние приложения (вызов по API)• Позвонить оператору
Водители
Водители
Что делает оператор
Что делает оператор
• Клиенты• Входящие/исходящие звонки
Что делает оператор
• Клиенты• Входящие/исходящие звонки
• Заказы• Наблюдение
Что делает оператор
• Клиенты• Входящие/исходящие звонки
• Заказы• Наблюдение
• Водители• Тревога• Подержка
Контроль качества
Back-office
• Отчеты• Отчеты• Отчеты
Что по архитектуре
• SOA
Что по архитектуре
• SOA• Redis
Что по архитектуре
• Django монолит• Go, Twisted
Раньше
• Ruby• Node.js
Storage
• Percona• Redis• Elasticsearch
Сервисы? Какие сервисы
• Отправщик пушей.
Сервисы? Какие сервисы
• Отправщик пушей. • Отправщик СМС
Сервисы? Какие сервисы
• Отправщик пушей. • Отправщик СМС• Backend для водителей
Сервисы? Какие сервисы
• Отправщик пушей. • Отправщик СМС• Прокси для водителей• Бекенд для клиентов
А еще у нас есть Docker
Что в Django
• Отдел контроля качества• Прием платежей• Учетное ядро• Отчеты• API для водителей• Менеджерская для управления
Проблемы
• Приложение – один большой кусок, который нужно выкатывать очень часто• Невозможно параллельно, многопоточно выполнять какие-то задачи• Много интеграций со сторонними сервисами
Решения
• Поддерживать существующее и жить дальше• Все переписать :trollface:
И пока не случилось
Давай в микросервисы
Микросервисы
• Маленькие
Микросервисы
• Маленькие• Сфокусированные
Микросервисы
• Маленькие• Сфокусированные• Слабосвязанные
Микросервисы
• Маленькие• Сфокусированные• Слабосвязанные• Высокосогласованные
Микросервисы
• Малый размер • Тонкое масштабирование• Быстрый деплой• Легкость тестирования• Любой язык
Синхронный подход
© Nginx.com
Асинхронный подход
© Nginx.com
А почему Go
• Строготипизированный• Компилируемый• CSP• Goroutine• sync.WaitGroup
Что есть в Go• Go-kit• Gizmo• Micro
• Echo• Gin• Mux
Как рефакторить
• Четкие границы в коде между модулями
Как рефакторить
• Четкие границы в коде между модулями• Понимание, что выносить
Как рефакторить
• Четкие границы в коде между модулями• Понимание, что выносить• Нет повторений в коде и копипасты
Как рефакторить
• Четкие границы в коде между модулями• Понимание, что выносить• Нет повторений в коде и копипасты• Тесты
Как рефакторить
• Четкие границы в коде между модулями• Понимание, что выносить• Нет повторений в коде и копипасты• Тесты• Много тестов
Как рефакторить
• Четкие границы в коде между модулями• Понимание, что выносить• Нет повторений в коде и копипасты• Тесты• Много тестов• Очень много тестов
Tradeoffs
Tradeoffs
• Latency
Tradeoffs
• Latency• Распределенные блокировки
Tradeoffs
• Latency• Распределенные блокировки• Eventual consistency
Tradeoffs
• Latency• Распределенные блокировки• Eventual consistency• Operational Complexity
Разделение на микросервисы
• Учетное ядро ака биллинг• Сервис отчетов• Сервис тарификации• Операторская• Бекенд водителей
Ок, кто первый?
• Учетное ядро ака биллинг
Наш путь
• Синхронный подход• Проще• Легче• В случае фейла все повторится
• HTTP REST API• Go• Echo• GORM• JWT
Наш путь
• Написали на Go• Написали тестов• Написали e2e тесты• Прогнали все• Собрали в докер• Спланировали • Задеплоили
Заблуждения
Заблуждения
• Более чистый код
Заблуждения
• Более чистый код• Это легче
Заблуждения
• Более чистый код• Это легче• Это быстрее
Заблуждения
• Более чистый код• Это легче• Это быстрее• Это лучше для инженеров
Заблуждения
• Более чистый код• Это легче• Это быстрее• Это лучше для инженеров• Это лучше масштабируется
Какие бенефиты?
Какие бенефиты?
• Меньше расход ресурсов
Какие бенефиты?
• Меньше расход ресурсов• Можем масштабировать отдельную фичу
Какие бенефиты?
• Меньше расход ресурсов• Можем масштабировать отдельную фичу• Поддерживать код стало чуть легче
Какие проблемы и подводные камни
• Конкурентный доступ• Балансировка
Конкурентный доступ
• Percona• Транзакции + select … for update
• Redis• Setnx
Балансировка
• Неравномерное использование ресурсов
Выводы
Выводы
• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода
Выводы
• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче
Выводы
• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче• К микросервисам нужно прийти
Выводы
• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче• К микросервисам нужно прийти • Лучше планируйте
Выводы
• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче• К микросервисам нужно прийти • Лучше планируйте• Преждевременно не оптимизируйте
Выводы
• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче• К микросервисам нужно прийти • Лучше планируйте• Преждевременно не оптимизируйте• Рефакторите итеративно
Вопросы?
Контакты
• https://github.com/gen1us2k• [email protected]• http://gen1us2k.com
• Слайды• http://bit.ly/gdgalmaty2016