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

86
Рефакторинг монолита в микросервисы на Go Минкин Андрей

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

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

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

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

Кто я

• TeamLead в MadDevs.io• Nambataxi.com• Nambafood.kg• Cybernamba.com• Kuppi.kg• Moika.kg• House.kg

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

Namba Taxi

• 4 года на рынке Бишкека

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

Namba Taxi

• 4 года на рынке Бишкека• Не менее 8к заказов в сутки

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

Namba Taxi

• 4 года на рынке Бишкека• Не менее 8к заказов в сутки• 600+ водителей на линии

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

Namba Taxi

• 4 года на рынке Бишкека• Не менее 8к заказов в сутки• 600+ водителей на линии• 300к довольных клиентов

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

Namba Taxi

• 4 года на рынке Бишкека• Не менее 8к заказов в сутки• 600+ водителей на линии• 300к довольных клиентов• 300 рпс на серверах

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

AVG response time

• Водители 20 ms• Операторы 2.5 ms

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

Что такое такси

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

Что такое такси

• Клиенты• Водители• Операторы КЦ• Контроль качества• Back office

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

Как вызвать такси

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

Как вызвать такси

• Приложение

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

Как вызвать такси

• Приложение• СМС

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

Как вызвать такси

• Приложение• СМС• Сайт

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

Как вызвать такси

• Приложение• СМС• Сайт• IPTV

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

Как вызвать такси

• Приложение• СМС• Сайт• IPTV• Сторонние приложения (вызов по API)

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

Как вызвать такси

• Приложение• СМС• Сайт• IPTV• Сторонние приложения (вызов по API)• Позвонить оператору

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

Водители

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

Водители

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

Что делает оператор

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

Что делает оператор

• Клиенты• Входящие/исходящие звонки

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

Что делает оператор

• Клиенты• Входящие/исходящие звонки

• Заказы• Наблюдение

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

Что делает оператор

• Клиенты• Входящие/исходящие звонки

• Заказы• Наблюдение

• Водители• Тревога• Подержка

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

Контроль качества

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

Back-office

• Отчеты• Отчеты• Отчеты

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

Что по архитектуре

• SOA

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

Что по архитектуре

• SOA• Redis

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

Что по архитектуре

• Django монолит• Go, Twisted

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

Раньше

• Ruby• Node.js

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

Storage

• Percona• Redis• Elasticsearch

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

Сервисы? Какие сервисы

• Отправщик пушей.

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

Сервисы? Какие сервисы

• Отправщик пушей. • Отправщик СМС

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

Сервисы? Какие сервисы

• Отправщик пушей. • Отправщик СМС• Backend для водителей

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

Сервисы? Какие сервисы

• Отправщик пушей. • Отправщик СМС• Прокси для водителей• Бекенд для клиентов

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

А еще у нас есть Docker

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

Что в Django

• Отдел контроля качества• Прием платежей• Учетное ядро• Отчеты• API для водителей• Менеджерская для управления

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

Проблемы

• Приложение – один большой кусок, который нужно выкатывать очень часто• Невозможно параллельно, многопоточно выполнять какие-то задачи• Много интеграций со сторонними сервисами

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

Решения

• Поддерживать существующее и жить дальше• Все переписать :trollface:

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

И пока не случилось

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

Давай в микросервисы

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

Микросервисы

• Маленькие

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

Микросервисы

• Маленькие• Сфокусированные

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

Микросервисы

• Маленькие• Сфокусированные• Слабосвязанные

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

Микросервисы

• Маленькие• Сфокусированные• Слабосвязанные• Высокосогласованные

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

Микросервисы

• Малый размер • Тонкое масштабирование• Быстрый деплой• Легкость тестирования• Любой язык

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

Синхронный подход

© Nginx.com

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

Асинхронный подход

© Nginx.com

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

А почему Go

• Строготипизированный• Компилируемый• CSP• Goroutine• sync.WaitGroup

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

Что есть в Go• Go-kit• Gizmo• Micro

• Echo• Gin• Mux

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

Как рефакторить

• Четкие границы в коде между модулями

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

Как рефакторить

• Четкие границы в коде между модулями• Понимание, что выносить

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

Как рефакторить

• Четкие границы в коде между модулями• Понимание, что выносить• Нет повторений в коде и копипасты

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

Как рефакторить

• Четкие границы в коде между модулями• Понимание, что выносить• Нет повторений в коде и копипасты• Тесты

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

Как рефакторить

• Четкие границы в коде между модулями• Понимание, что выносить• Нет повторений в коде и копипасты• Тесты• Много тестов

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

Как рефакторить

• Четкие границы в коде между модулями• Понимание, что выносить• Нет повторений в коде и копипасты• Тесты• Много тестов• Очень много тестов

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

Tradeoffs

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

Tradeoffs

• Latency

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

Tradeoffs

• Latency• Распределенные блокировки

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

Tradeoffs

• Latency• Распределенные блокировки• Eventual consistency

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

Tradeoffs

• Latency• Распределенные блокировки• Eventual consistency• Operational Complexity

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

Разделение на микросервисы

• Учетное ядро ака биллинг• Сервис отчетов• Сервис тарификации• Операторская• Бекенд водителей

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

Ок, кто первый?

• Учетное ядро ака биллинг

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

Наш путь

• Синхронный подход• Проще• Легче• В случае фейла все повторится

• HTTP REST API• Go• Echo• GORM• JWT

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

Наш путь

• Написали на Go• Написали тестов• Написали e2e тесты• Прогнали все• Собрали в докер• Спланировали • Задеплоили

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

Заблуждения

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

Заблуждения

• Более чистый код

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

Заблуждения

• Более чистый код• Это легче

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

Заблуждения

• Более чистый код• Это легче• Это быстрее

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

Заблуждения

• Более чистый код• Это легче• Это быстрее• Это лучше для инженеров

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

Заблуждения

• Более чистый код• Это легче• Это быстрее• Это лучше для инженеров• Это лучше масштабируется

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

Какие бенефиты?

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

Какие бенефиты?

• Меньше расход ресурсов

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

Какие бенефиты?

• Меньше расход ресурсов• Можем масштабировать отдельную фичу

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

Какие бенефиты?

• Меньше расход ресурсов• Можем масштабировать отдельную фичу• Поддерживать код стало чуть легче

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

Какие проблемы и подводные камни

• Конкурентный доступ• Балансировка

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

Конкурентный доступ

• Percona• Транзакции + select … for update

• Redis• Setnx

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

Балансировка

• Неравномерное использование ресурсов

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

Выводы

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

Выводы

• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода

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

Выводы

• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче

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

Выводы

• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче• К микросервисам нужно прийти

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

Выводы

• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче• К микросервисам нужно прийти • Лучше планируйте

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

Выводы

• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче• К микросервисам нужно прийти • Лучше планируйте• Преждевременно не оптимизируйте

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

Выводы

• Не нужно добавлять сетевое ограничение чтобы оправдать написание лучшего кода• Распределенные транзакции никогда не легче• К микросервисам нужно прийти • Лучше планируйте• Преждевременно не оптимизируйте• Рефакторите итеративно

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

Вопросы?

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

Контакты

• https://github.com/gen1us2k• [email protected]• http://gen1us2k.com

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