Upload
spbdotnet-community
View
14
Download
1
Embed Size (px)
Citation preview
Saritasa ToolsИли ещё один подход к архитектуре
приложения
Иван Кожин, Очень Интересно
1
Наш зоопарк проектов
2
Случай на проекте
Заказчик: У меня при заказе товара происходит ошибка…
3
Случай на проекте
4
Случай на проекте
Мы: Ок, а какой аккаунт вы использовали?Заказчик: [email protected]Мы: На какой странице и какой продукт вы запрашивали?…
5
Случай на проекте #2
6
7
Ну, извините...
Цели
● Разработать гибкую типовую архитектуру для наших проектов.
8
Цели
● Разработать гибкую типовую архитектуру для наших проектов.
● Заложить в архитектуру возможность журналирования событий в проекте.
9
Цели
● Разработать гибкую типовую архитектуру для наших проектов.
● Заложить в архитектуру возможность журналирования событий в проекте.
● Предоставить возможность анализа состояния системы в различное время.
10
Цели
● Разработать гибкую типовую архитектуру для наших проектов.
● Заложить в архитектуру возможность журналирования событий в проекте.
● Предоставить возможность анализа состояния системы в различное время.
● Улучшить возможности интеграционного тестирования наших проектов.
11
Паттерн «Команда»
CreateWorklogCommand
CreateWorklog()
Команда Обработчик
12
CQRS
13
Command-query responsibility segregation
CQRS
14
Проект Saritasa Tools
● Связывание команды и обработчика● Сохранение списка команд● Сохранение дополнительной информации● ...
15
Saritasa Tools Messages
16
Common
Misc
Domain
Emails
EF6EFCore1
Messages
PSGallery
СообщенияПользователи
Внутренние задачи
Веб-сервисы
MessageНаше
приложение
17
Типы сообщений
Сообщение (Message)
Команда Событие Запрос
18
Сообщения
Middleware 1
Middleware 2
Ваш код(controller action, service handler, etc)
Middleware 3
Message
Message
Message
Pipeline
19
Pipelines
20
Commands Pipeline
Queries Pipeline
Events Pipeline
Pipelines
Pipelines
● Commands Pipeline - Отвечает за изменение состояния приложения (например, запись в хранилище, файлы).
21
Pipelines
● Commands Pipeline - Отвечает за изменение состояния приложения (например, запись в хранилище, файлы).
● Query Pipeline - Используется для запросов состояния приложения.
22
Pipelines
● Commands Pipeline - Отвечает за изменение состояния приложения (например, запись в хранилище, файлы).
● Query Pipeline - Используется для запросов состояния приложения.
● Events Pipeline - События, происходящие в командах. Могут иметь несколько обработчиков.
23
Pipeline - создание
24
Middleware (слой)
25
Middleware - добавление
26
Middleware - добавление
27
Message Context
● идентификатор (GUID);● сообщение (данные);● статус;● дата создания;● исключение (если произошло);● дополнительные данные (словарь);● Сервис-провайдер (IServiceProvider);
28
Статусы сообщений
● NotInitialized;● Processing;● Completed;● Failed;● Rejected;
29
Repository Middleware● Сообщения могут быть сохранены для:
○ ведения журнала;○ повторного выполнения;○ анализа;
● Можно установить фильтр.● Поддерживаемые хранилища:
○ ADO.NET○ файлы○ Elasticsearch○ Loggly○ веб-сервис○ JSON○ ... 30
Формат сообщения
31
Формат сообщения
32
Формат сообщения
33
Формат сообщения
34
Формат сообщения
35
Формат сообщения
36
Формат сообщения
37
Формат сообщения
38
Repository Middleware - Инициализация
39
ADO.NET Repository
40
Middleware Repositories - фильтрация
41
Command (команда)
● Изменяет состояние приложения.● Команда и обработчик — разные сущности.● Может возвращать результат.
42
Пример команды
43
Handler (обработчик)
44
Регистрация обработчиков
45
Выполнение
46
Выполнение
Locator
Resolver
Executor
Поиск обработчика
Создание класса обработчика
Выполнение
Поиск pipeline, формирование контекста сообщения и передача первому слою.
47
Внедрение зависимостей
48
Внедрение зависимостей
● IMessagePipelineContainer - Singleton● IMessagePipelineService - Transient (Scoped)
○ Pipeline Container○ IServiceProvider
IMessagePipelineService● Container● Service Provider
49
Внедрение зависимостей
50
Внедрение зависимостей
51
Query Pipeline
1. Не изменяет состояние.2. Рекомендуется использовать в том случае, если
необходимо журналировать аргументы метода и результат.
52
Query Pipeline
53
Query Pipeline
54
Query Pipeline - реализация
55
Query Pipeline - реализация
56
Events Pipeline
CreateUserCommand
UserCreatedEvent
Отправить e-mail
Обновить статистику ...
57
Events Pipeline - Event Class
58
Events Pipeline - Event Handler
59
Events Pipeline - Raise Event
60
Собственный middleware
61
Производительность
1. Замена рефлексии кодогенерацией.2. Кэширование.
62
Производительность
63
Производительность
64
ПроизводительностьКеширование делегатов дало увеличение производительности выполнения команд примерно в два раза.
Было
Стало
65
Использование в тестировании
Наше приложениеWebEndpoint
Saritasa.Tools.ConsoleMessagesMonitor
JSON-файл
Сеть
66
Использование в тестировании
67
Лог сообщений
Message 1 Message 2 Message 3
~Event Sourcing
68
Структура проекта
● Domain○ Commands○ Entities○ Events○ Handlers○ Queries○ ...
69
А как же “легаси”?
70
“Легаси”
1. Не всё так просто, зависит от проекта.
71
“Легаси”
1. Не всё так просто, зависит от проекта.2. Можно подключить библиотеку и использовать там, где
журналирование наиболее необходимо.
72
“Легаси”
1. Не всё так просто, зависит от проекта.2. Можно подключить библиотеки и использовать там, где
журналирование наиболее необходимо.3. Переделывать при рефакторинге.
73
Что получилось?
● Унифицировать архитектуру проектов.
74
Что получилось?
● Унифицировать архитектуру проектов.● Упростить отладку при возникновении сбоев.
75
Что получилось?
● Унифицировать архитектуру проектов.● Упростить отладку при возникновении сбоев.● Ввести интеграционное тестирование на
основе команд.
76
Что получилось?
● Унифицировать архитектуру проектов.● Упростить отладку при возникновении сбоев.● Ввести интеграционное тестирование на
основе команд.● Осуществлять простой мониторинг
приложения (больше данных о том, что происходит внутри).
77
Над чем надо работать
● Всё ещё бета.
78
Над чем надо работать
● Всё ещё бета.● Нет нормальных средств для сбора статистики.
79
Над чем надо работать
● Всё ещё бета.● Нет нормальных средств для сбора статистики.● Интерфейс пользователя для просмотра
сообщений в разработке.
80
Над чем надо работать
● Всё ещё бета.● Нет нормальных средств для сбора статистики.● Интерфейс пользователя для просмотра
сообщений в разработке.● Всё ещё находятся баги.
81
Над чем надо работать
● Всё ещё бета.● Нет нормальных средств для сбора статистики.● Интерфейс пользователя для просмотра
сообщений в разработке.● Всё ещё находятся баги.● Документация :)
82
И еще один вывод
Фреймворк - это сложно
83
Кто помогал...
84
Спасибо за внимание!
● https://github.com/Saritasa/SaritasaTools● https://saritasa-tools.readthedocs.io/en/latest/
Вопросы?
85