На пути к распределенной системе

A presentation at Stachka in October 2019 in Kazan, Republic of Tatarstan, Russia by Roman Gordeev

Slide 1

Slide 1

На пути к распределенной системе

Современные приложения часто представляют собой непростую топологию разрозненных сервисов, объединенных неумолимым конвейером бизнес процессов. С одной стороны это дает определённые преимущества, но в то же время накладывает весьма серьезные ограничения на применяемые архитектурные подходы и инженерные решения при проектировании подобных приложений.

Slide 2

Slide 2

Как и любая подобная история, эта история начинается с приложения…

Slide 3

Slide 3

Slide 4

Slide 4

ВСЕ НОВЫЕ ПРИЛОЖЕНИЯ ВОСХИТИТЕЛЬНЫ ОДИНАКОВО, КАЖДОЕ СТАРОЕ ПРИЛОЖЕНИЕ УРОДЛИВО ПО-СВОЕМУ…

Slide 5

Slide 5

Slide 6

Slide 6

О чем разговор?

  1. Еще раз о микросервисах
  2. Чеклист для ORM
  3. Простые решения для непростых ситуаций

Slide 7

Slide 7

● удобство эксплуатации ● простота ● возможность развития

Slide 8

Slide 8

Что делать?

Slide 9

Slide 9

И, главное, как?

спойлер: переехать на микросервисы ;)…

Slide 10

Slide 10

Наивное проектирование...

Slide 11

Slide 11

● Крис Ричардсон. Микросервисы. Паттерны разработки и рефакторинга ● Георг Хопе. Паттерны интеграции корпоративных приложений

Slide 12

Slide 12

Основная гипотеза

Slide 13

Slide 13

= SHARED DB =

Slide 14

Slide 14

Slide 15

Slide 15

Slide 16

Slide 16

РЕЦЕПТ

“Это зависит от удачи. Все зависит от удачи…”

Slide 17

Slide 17

Ингредиенты...

● КАНОНИЧЕСКАЯ МОДЕЛЬ?! ● EventSoursing?! ● CQRS?! ● Saga

Slide 18

Slide 18

Каноническая модель данных

Slide 19

Slide 19

Event Sourcing

Slide 20

Slide 20

CQRS

Slide 21

Slide 21

Slide 22

Slide 22

Slide 23

Slide 23

Slide 24

Slide 24

Slide 25

Slide 25

Slide 26

Slide 26

Простые трудности...

Slide 27

Slide 27

Чек-лист пользователя ORM

Slide 28

Slide 28

Vlad Mihalcea

Slide 29

Slide 29

По умолчанию используйте Lazy Fetching

Slide 30

Slide 30

Slide 31

Slide 31

Никогда не используйте Table Generator!

Slide 32

Slide 32

Slide 33

Slide 33

Slide 34

Slide 34

Используйте генераторы “последнего поколения”

Slide 35

Slide 35

Slide 36

Slide 36

Slide 37

Slide 37

Slide 38

Slide 38

Slide 39

Slide 39

Slide 40

Slide 40

Сконфигурируйте Batching

Slide 41

Slide 41

● hibernate.jdbc.batch_size=30 ● hibernate.order_inserts=true ● hibernate.order_updates=true

Slide 42

Slide 42

Для отладки используйте механизмы логирования ORM и Proxy DataSource/Driver

Slide 43

Slide 43

Slide 44

Slide 44

P6Spy

Slide 45

Slide 45

Что делать, если приложение “тормозит”?

Slide 46

Slide 46

Используйте JMX!

Slide 47

Slide 47

Slide 48

Slide 48

Slide 49

Slide 49

Майкл Нейгард. Release it! Проектирование и дизайн ПО для тех, кому не все равно

Slide 50

Slide 50

Slide 51

Slide 51

Slide 52

Slide 52

Slide 53

Slide 53

Slide 54

Slide 54

Timeouts

Slide 55

Slide 55

Slide 56

Slide 56

Slide 57

Slide 57

Slide 58

Slide 58

Slide 59

Slide 59

Slide 60

Slide 60

Bulkhead

Slide 61

Slide 61

Slide 62

Slide 62

Slide 63

Slide 63

Slide 64

Slide 64

Circuitbreaker

Slide 65

Slide 65

Slide 66

Slide 66

Slide 67

Slide 67

Slide 68

Slide 68

Slide 69

Slide 69

Resilience4j

Slide 70

Slide 70

ИТОГО

● Удобные для вас решения - обычно правильные ● Data First ● Следите за пулами соединений и потоков ● Тестируйте самые худшие сценарии ● Не пренебрегайте специализированными инструментами

Slide 71

Slide 71

References

● Gregor Hohpe. Enterprise Integration Patterns ● Chris Richardson. Microservices Patterns ● Sebastian Daschner. Architecting Modern Java EE Applications ● Martin Kleppmann. Designing Data-Intensive Applications ● Николай Голов. Целостность данных в микросервисной архитектуре

Slide 72

Slide 72

Критика приветствуется, но не является обязательной ;)