85
Saritasa Tools Или ещё один подход к архитектуре приложения Иван Кожин, Очень Интересно 1

Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Embed Size (px)

Citation preview

Page 1: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Saritasa ToolsИли ещё один подход к архитектуре

приложения

Иван Кожин, Очень Интересно

1

Page 2: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Наш зоопарк проектов

2

Page 3: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Случай на проекте

Заказчик: У меня при заказе товара происходит ошибка…

3

Page 4: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Случай на проекте

4

Page 5: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Случай на проекте

Мы: Ок, а какой аккаунт вы использовали?Заказчик: [email protected]Мы: На какой странице и какой продукт вы запрашивали?…

5

Page 6: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Случай на проекте #2

6

Page 7: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

7

Ну, извините...

Page 8: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Цели

● Разработать гибкую типовую архитектуру для наших проектов.

8

Page 9: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Цели

● Разработать гибкую типовую архитектуру для наших проектов.

● Заложить в архитектуру возможность журналирования событий в проекте.

9

Page 10: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Цели

● Разработать гибкую типовую архитектуру для наших проектов.

● Заложить в архитектуру возможность журналирования событий в проекте.

● Предоставить возможность анализа состояния системы в различное время.

10

Page 11: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Цели

● Разработать гибкую типовую архитектуру для наших проектов.

● Заложить в архитектуру возможность журналирования событий в проекте.

● Предоставить возможность анализа состояния системы в различное время.

● Улучшить возможности интеграционного тестирования наших проектов.

11

Page 12: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Паттерн «Команда»

CreateWorklogCommand

CreateWorklog()

Команда Обработчик

12

Page 13: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

CQRS

13

Command-query responsibility segregation

Page 14: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

CQRS

14

Page 15: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Проект Saritasa Tools

● Связывание команды и обработчика● Сохранение списка команд● Сохранение дополнительной информации● ...

15

Page 16: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Saritasa Tools Messages

16

Common

Misc

Domain

Emails

EF6EFCore1

Messages

PSGallery

Page 17: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

СообщенияПользователи

Внутренние задачи

Веб-сервисы

MessageНаше

приложение

17

Page 18: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Типы сообщений

Сообщение (Message)

Команда Событие Запрос

18

Page 19: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Сообщения

Middleware 1

Middleware 2

Ваш код(controller action, service handler, etc)

Middleware 3

Message

Message

Message

Pipeline

19

Page 20: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Pipelines

20

Commands Pipeline

Queries Pipeline

Events Pipeline

Pipelines

Page 21: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Pipelines

● Commands Pipeline - Отвечает за изменение состояния приложения (например, запись в хранилище, файлы).

21

Page 22: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Pipelines

● Commands Pipeline - Отвечает за изменение состояния приложения (например, запись в хранилище, файлы).

● Query Pipeline - Используется для запросов состояния приложения.

22

Page 23: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Pipelines

● Commands Pipeline - Отвечает за изменение состояния приложения (например, запись в хранилище, файлы).

● Query Pipeline - Используется для запросов состояния приложения.

● Events Pipeline - События, происходящие в командах. Могут иметь несколько обработчиков.

23

Page 24: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Pipeline - создание

24

Page 25: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Middleware (слой)

25

Page 26: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Middleware - добавление

26

Page 27: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Middleware - добавление

27

Page 28: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Message Context

● идентификатор (GUID);● сообщение (данные);● статус;● дата создания;● исключение (если произошло);● дополнительные данные (словарь);● Сервис-провайдер (IServiceProvider);

28

Page 29: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Статусы сообщений

● NotInitialized;● Processing;● Completed;● Failed;● Rejected;

29

Page 30: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Repository Middleware● Сообщения могут быть сохранены для:

○ ведения журнала;○ повторного выполнения;○ анализа;

● Можно установить фильтр.● Поддерживаемые хранилища:

○ ADO.NET○ файлы○ Elasticsearch○ Loggly○ веб-сервис○ JSON○ ... 30

Page 31: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Формат сообщения

31

Page 32: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Формат сообщения

32

Page 33: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Формат сообщения

33

Page 34: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Формат сообщения

34

Page 35: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Формат сообщения

35

Page 36: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Формат сообщения

36

Page 37: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Формат сообщения

37

Page 38: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Формат сообщения

38

Page 39: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Repository Middleware - Инициализация

39

Page 40: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

ADO.NET Repository

40

Page 41: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Middleware Repositories - фильтрация

41

Page 42: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Command (команда)

● Изменяет состояние приложения.● Команда и обработчик — разные сущности.● Может возвращать результат.

42

Page 43: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Пример команды

43

Page 44: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Handler (обработчик)

44

Page 45: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Регистрация обработчиков

45

Page 46: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Выполнение

46

Page 47: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Выполнение

Locator

Resolver

Executor

Поиск обработчика

Создание класса обработчика

Выполнение

Поиск pipeline, формирование контекста сообщения и передача первому слою.

47

Page 48: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Внедрение зависимостей

48

Page 49: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Внедрение зависимостей

● IMessagePipelineContainer - Singleton● IMessagePipelineService - Transient (Scoped)

○ Pipeline Container○ IServiceProvider

IMessagePipelineService● Container● Service Provider

49

Page 50: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Внедрение зависимостей

50

Page 51: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Внедрение зависимостей

51

Page 52: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Query Pipeline

1. Не изменяет состояние.2. Рекомендуется использовать в том случае, если

необходимо журналировать аргументы метода и результат.

52

Page 53: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Query Pipeline

53

Page 54: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Query Pipeline

54

Page 55: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Query Pipeline - реализация

55

Page 56: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Query Pipeline - реализация

56

Page 57: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Events Pipeline

CreateUserCommand

UserCreatedEvent

Отправить e-mail

Обновить статистику ...

57

Page 58: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Events Pipeline - Event Class

58

Page 59: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Events Pipeline - Event Handler

59

Page 60: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Events Pipeline - Raise Event

60

Page 61: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Собственный middleware

61

Page 62: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Производительность

1. Замена рефлексии кодогенерацией.2. Кэширование.

62

Page 63: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Производительность

63

Page 64: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Производительность

64

Page 65: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

ПроизводительностьКеширование делегатов дало увеличение производительности выполнения команд примерно в два раза.

Было

Стало

65

Page 66: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Использование в тестировании

Наше приложениеWebEndpoint

Saritasa.Tools.ConsoleMessagesMonitor

JSON-файл

Сеть

66

Page 67: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Использование в тестировании

67

Page 68: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Лог сообщений

Message 1 Message 2 Message 3

~Event Sourcing

68

Page 69: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Структура проекта

● Domain○ Commands○ Entities○ Events○ Handlers○ Queries○ ...

69

Page 70: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

А как же “легаси”?

70

Page 71: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

“Легаси”

1. Не всё так просто, зависит от проекта.

71

Page 72: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

“Легаси”

1. Не всё так просто, зависит от проекта.2. Можно подключить библиотеку и использовать там, где

журналирование наиболее необходимо.

72

Page 73: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

“Легаси”

1. Не всё так просто, зависит от проекта.2. Можно подключить библиотеки и использовать там, где

журналирование наиболее необходимо.3. Переделывать при рефакторинге.

73

Page 74: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Что получилось?

● Унифицировать архитектуру проектов.

74

Page 75: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Что получилось?

● Унифицировать архитектуру проектов.● Упростить отладку при возникновении сбоев.

75

Page 76: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Что получилось?

● Унифицировать архитектуру проектов.● Упростить отладку при возникновении сбоев.● Ввести интеграционное тестирование на

основе команд.

76

Page 77: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Что получилось?

● Унифицировать архитектуру проектов.● Упростить отладку при возникновении сбоев.● Ввести интеграционное тестирование на

основе команд.● Осуществлять простой мониторинг

приложения (больше данных о том, что происходит внутри).

77

Page 78: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Над чем надо работать

● Всё ещё бета.

78

Page 79: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Над чем надо работать

● Всё ещё бета.● Нет нормальных средств для сбора статистики.

79

Page 80: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Над чем надо работать

● Всё ещё бета.● Нет нормальных средств для сбора статистики.● Интерфейс пользователя для просмотра

сообщений в разработке.

80

Page 81: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Над чем надо работать

● Всё ещё бета.● Нет нормальных средств для сбора статистики.● Интерфейс пользователя для просмотра

сообщений в разработке.● Всё ещё находятся баги.

81

Page 82: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Над чем надо работать

● Всё ещё бета.● Нет нормальных средств для сбора статистики.● Интерфейс пользователя для просмотра

сообщений в разработке.● Всё ещё находятся баги.● Документация :)

82

Page 83: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

И еще один вывод

Фреймворк - это сложно

83

Page 84: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Кто помогал...

84

Page 85: Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»

Спасибо за внимание!

● https://github.com/Saritasa/SaritasaTools● https://saritasa-tools.readthedocs.io/en/latest/

Вопросы?

85