О себе
О компании
О чем доклад?
Проблематика больших монолитных систем
Суть микросервисоного подхода
Плюсы и минусы
Вам не нужны микросервисы, если
Вам нужны микросервисы, если
Разрез на сервисы
Разрез на сервисы
Размер сервиса
Один VCS/CI/CD на сервис
База данных
Events или RPC
Выбор протокола обмена сообщениями
Брокер сообщений
ApiGateway
ApiGateway
ApiGateway
BFF
BFF
HTTP Proxy(Ocelot)
HTTP Proxy(Ocelot)
HTTP Proxy(Ocelot)
HTTP Proxy(Ocelot)
Платеж с дефолтной карты
Сильная связанность
Aggregate
Умный - глупый
Структура умного сервиса
Структура простого сервиса
Структура простого сервиса
Умные и простые
Переиспользуемые
Пример
Конфигурация через окружение
Общий код
Общий код
Общий код
Проблемы
Несогласованность данных
Отложенная согласованность на событиях
Идемпотентность
Трассировка
Трассировака
Трассировка
Версионирование
Версионирование
Тестирование
TestContainers
Проблема
Решение
VM or Container

Микросервисная архитектура, подходы и технологии

1.

Микросервисная архитектура,
подходы и технологии
Ветчинкин Кирилл
https://www.facebook.com/k.vetchinkin
[email protected]

2. О себе


Руководитель разработки,
архитектор
Практикую:
IT strategy
Agile
DevOps
Микросервисы

3. О компании

• Финтех-проекты
• Платежные системы
• Крупные интеграции

4. О чем доклад?

• Вспомним кратко идею подхода
• Нужны ли вам микросервисы?
• Архитектура системы
• Паттерны/антипаттерны
• Проблемы и решения
• Развертывание и технологии

5. Проблематика больших монолитных систем

• Плохое горизонтальное масштабирование
• Плохая отказоустойчивость
• Сложность внедрения новых технологий
• Сложность рефакторинга legacy
• И т.п.…

6. Суть микросервисоного подхода

7. Плюсы и минусы

Плюсы
• Горизонтальное
масштабирование
• Отказоустойчивость
• Масштабирование команд
• Переиспользование
• Гибкость стека
Минусы
• Сложно
• Дорого
• Не согласованные данные

8. Вам не нужны микросервисы, если

• Вы делаете стартап (MVP)
• Нет или не предполагается рост нагрузки

9. Вам нужны микросервисы, если

• Высокая нагрузка
• Система растет
• Команда растет
• Нужна отказоустойчивость
• Необходимо сократить TTM

10. Разрез на сервисы

Контракт
Логика
Платежи
История платежей
Акции
Sms
Отчеты
Dal
OLTP
OLAP

11. Разрез на сервисы

Не разрезайте по слоям, разрезайте по бизнес-контекстам
Платежи
История
платежей
Контракт
Контракт
Логика
Логика
DAL
DAL
Акции
Sms
Контракт
Отчеты
Контракт
Контракт
CRUD
QUERY

12. Размер сервиса

• На основе бизнес-контекста
• На основе сетевых запросов
• На основе транзакций
Платежи
Акции
Sms

13. Один VCS/CI/CD на сервис

• Один сервис – один репозиторий
• Один сервис – один CI-конвейер
• Один сервис – один CD-конвейер

14. База данных

• Один сервис – одна база
• Выбор типа базы данных
зависит от задачи
Платежи
История
платежей
Контракт
Контракт
Логика
Логика
DAL
DAL

15. Events или RPC

Events(AMQP, MSMQ и т.п)
RPC(HTTP REST)
• Асинхронное
взаимодействие
• Синхронное
взаимодействие

16. Выбор протокола обмена сообщениями

• Специфические для
платформы (JMS, MSMQ)
• Независимые от платформы
стандарты (AMQP и прочие)

17. Брокер сообщений

ApiGateway
18

18. ApiGateway

• Единая точка входа для клиента
• Нет логики
• Делается под клиента

19. ApiGateway

API Gateway
20

20. ApiGateway

BFF
API Gateway
21

21. BFF

Public
API
Private
API
Admin
API
22

22. BFF

HTTP Proxy(Ocelot)
https://github.com/ThreeMammals/Ocelot
23

23. HTTP Proxy(Ocelot)

[GET] api/v1/card/{id}
Public
API
[GET] api/v1/card/{id}
Private
API
[GET] api/v1/card/{id}
Admin
API
[GET] api/v1/card/{id}
Card
service
24

24. HTTP Proxy(Ocelot)

[GET] api/v1/card/{id}
Private
API
[GET] api/v1/card/{id}
Card
service
25

25. HTTP Proxy(Ocelot)

[GET] api/v1/card/{id}
Public
API
[GET] api/v1/card/{id}
Private
API
[GET] api/v1/card/{id}
Admin
API
[GET] api/v1/card/{id}
Card
service
26

26. HTTP Proxy(Ocelot)

Платеж с дефолтной карты
Public
API
Private
API
Card
service
Payment
service
27

27. Платеж с дефолтной карты

Сильная связанность
Public
API
Card
service
Private
API
Payment
service
28

28. Сильная связанность

Aggregate
Public
API
Private
API
Payment
aggregate
Card
service
Payment
service
29

29. Aggregate

Архитектура сервиса

30.

Умный - глупый
Payment
service
Sms
service
CQS
DDD
Repository
Domain events
30 строк кода
прямо в
Consumer
31

31. Умный - глупый

Структура умного сервиса
REST API
Payment
service
Consumers
Query
Command
Domains
Infrastructure
32

32. Структура умного сервиса

Структура простого сервиса
REST API
Simple
service
CRUD
33

33. Структура простого сервиса

REST API
Consumers
Simple
service
Simple code
34

34. Структура простого сервиса

Умные и простые
User
service
Report
service
Quartz
service
Payment
service
Acceptcode
service
Identification
service
Autopayment
service
Notification
service
Reconciliation
service
Sms
service
35

35. Умные и простые

Переиспользуемые
• Сервис решает типовые задачи
• В идеале это контейнер

36. Переиспользуемые

Пример
User
service
Report
service
Quartz
service
Payment
service
Acceptcode
service
Filebeat
service
Autopayment
service
Notification
service
Identification
service
Reconciliation
service
Sms
service
Ocelot
API
Push
service
37

37. Пример

Общий код
• Нарушение DRY – нормально
• Nuget для того, что фундаментально и не меняется

38. Конфигурация через окружение

Общий код
41

39. Общий код

Проблемы и решения

40. Общий код

Проблемы
MobileApi
WebApi
Платежи
Sms
История
платежей
Брокер сообщений
Отчеты

41. Общий код

Несогласованность данных
• Нет ACID-транзакций
• Возможна
несогласованность
Платежи
История
платежей
+1
0
Брокер сообщений

42.

Отложенная согласованность на
событиях
CRON
Local transaction
Платежи
Id
Amount
Id
Data
State
1
1000
1
{…}
New
+1
История
платежей
+1
Брокер сообщений

43. Проблемы

Идемпотентность
• Повторы неизбежны
• Делайте методы идемпотентными
• Регистрируйте уже принятые ID событий
• Игнорируйте более давние события

44. Несогласованность данных

Трассировка
• Единый ID на бизнес-запрос
• Можно использовать ActivityId
• Можно воспользоваться http://opentracing.io/

45. Отложенная согласованность на событиях

Трассировака
ApiGateway
ActivityId
Платежи
Sms
ActivityId
ActivityId
Брокер сообщений
ActivityId = “1234”
GSMОператор

46. Идемпотентность

Трассировка
ActivityId
1234
1234
1234
1234
ServiceName
ApiGateway
Платежи
Sms
GSM Оператор
Logs
Exception
500

47. Трассировка

Версионирование
• Необходимо для поддержания обратной совместимости
• Позволяет развивать сервисы

48. Трассировака

Версионирование
REST
v1
ApiGateway
v2
Платежи
v1
v2
AMQP
v1
Sms
v1
v2
v2

49. Трассировка

Тестирование
Платежи
v1
Unit
Integration
End-to-end
Sms
Unit
v1
v2
v5
v9
Integration
v2

50. Версионирование

TestContainers
Сервис 1
Код
Unit
Сервис 3
Intergration
Зависимости

51. Версионирование

Развёртывание

52. Тестирование

Проблема
• Развертывать >25 сервисов
• А если с 6-кратным дублированием
• И 50 сборок в день
• А с тестированием что?
• Релизы >1 релиза в день

53. TestContainers

Решение
• DevOps
• DevOps
• И..
• Конечно, DevOps

54.

VM or Container
VM
Container
• Долго поднимается
• Инфраструктура
настраивается
• Медленно «переезжает»
• Быстро поднимается
• Инфраструктура внутри
• Легко «переезжает»

55. Проблема

VM или (Container + Оркестрация)
VM
Container + оркестрация (k8s)
• AutoScaling – вручную
• AutoDescovery – вручную
• Supervising – вручную
• Blue/Green deploy – вручную
• Балансировка – в ручную
• AutoScaling – из коробки
• AutoDescovery – из коробки
• Supervising – из коробки
• Blue/Green deploy – из
коробки
• Балансировка – из коробки*

56. Решение

Гибкость
16.00 – 21.00
vm2
vm1
X1
X2
Отчеты
Акции
Акц
X3
Платежи
X1
X1
Sms
История
платежей
X2
X1
Sms
Платежи
История
платежей
cloud
Отчеты
X3
X2
Платежи

57. VM or Container

Вопросы
Ветчинкин Кирилл
https://www.facebook.com/k.vetchinkin
[email protected]
English     Русский Правила