Рефакторинг монолита в микросервисы на Go

Post on 09-Jan-2017

262 views 5 download

Transcript of Рефакторинг монолита в микросервисы на 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• chaka@maddevs.io• http://gen1us2k.com

• Слайды• http://bit.ly/gdgalmaty2016