
Roman
27.12.2017
07:34:08

Bohdan
27.12.2017
07:34:28
в комманд хендлер инжектится EventRecorder, который только хранит брошенные ивенты
а из него ивенты достаёт комманд диспатчер, который и передаёт уже ивент диспатчеру
шо. опять..)
надо же послушать, кто какое гуано наворотил и обсудить свое)

Anton
27.12.2017
07:35:06

Google

Roman
27.12.2017
07:35:36
изи страта)

Bohdan
27.12.2017
07:35:42
у меня вообще реализация некошерная, но под мои нужны норм
если надо ивент без команды кинуть (хотя стараюсь так не делать) - можно напрямую в ивент диспатчер кинуть

Roman
27.12.2017
07:36:11
Почему нельзя сразу в диспетчер кидать?

Anton
27.12.2017
07:36:26
На самом деле не вижу большой разницы статически или нет пробрабрасывать ивенты

Roman
27.12.2017
07:36:43

Bohdan
27.12.2017
07:36:59
тогда надо воротить в диспетчере логику отложенного запуска ивентов)

Roman
27.12.2017
07:37:02
На шарпике пишу бэкэнды если что - доткоры там

Anton
27.12.2017
07:37:07
Больше проблема если ивенты уйдут в диспатчер (ивент бас, etc.) до персиста сущности

Bohdan
27.12.2017
07:37:14
вот вот

Anton
27.12.2017
07:37:24
Вот этот момент принципиален, ибо можно нехило так выстрелить в ногу себе

Roman
27.12.2017
07:37:32

Google

Roman
27.12.2017
07:37:42
Вернее эвентов

Bohdan
27.12.2017
07:38:28
у меня в прошлой реализации этим занимались сами диспетчеры (раскидывали запуск вложенных команд /структур в последовательный запуск)
но так неудобно и больше мест для ошибки
у меня она и так синхронная)

Anton
27.12.2017
07:38:47
Синхронно или нет опять же не важно. Важен порядок: сначала удостоверились что сущность сохранилась, потом диспатчим ивенты

Bohdan
27.12.2017
07:38:49
но можно и асинк сделать

Anton
27.12.2017
07:39:29
Но по своей сути ивенты это асинхронная схема

Roman
27.12.2017
07:39:40
Ну то бишь создал я юзера, предположим. Сохранил его в базу. Если он сохранился - вызываю диспетчер с ивентом "Создан новый юзер", который вызывет каких-то обработчиков (ну либо не вызывает, если их нет))). Далее, если обработчики успешно отработали (без эксепшенов) - коммичу транзакцию. Если нет - ролбэкаю, плюю ошибку.

Anton
27.12.2017
07:39:50
Так что если важен порядок то надо пересматривать схему ивентов

Roman
27.12.2017
07:40:59
А для асинхронной обработки - типа мыло отправить - обработчик будет этот ивент писать в рэбит какой-нить. Рэбит лежит - значит юзеры не создаются, потому что мои сервисы не могут общаться между собой.
Ну а из рэбита его какой нить сервис отправки имэйлов заберёт.

Anton
27.12.2017
07:41:00
У меня пока так: сущность, персист, комит транзакции, диспатчинг ивентов
Порядок чуть другой

Roman
27.12.2017
07:41:36
Норм такое решение?

Anton
27.12.2017
07:42:23
Тут вопрос зачем? Я пока не вижу этому достаточных аргументов
Как по мне не ок, проблему ты сам выше отписал

Bohdan
27.12.2017
07:43:12
ивенты это сайд эффект завершенного действия
и в сценарии с юзером лучше делать в нем поле emailSent и проверять его имхо

Roman
27.12.2017
07:44:07
Я просто думаю на этот счёт, что если я не смог уведомить другие компоненты системы о сових эвентов - то действие не считается завершённым.

Anton
27.12.2017
07:44:16

Google

Roman
27.12.2017
07:44:22
Уведомление - это запись в рэбит.
И смс
и телега
и что угодно вообще

Bohdan
27.12.2017
07:45:49
но тем не менее в моем понимании действие не должно зависеть от ивентов

Anton
27.12.2017
07:46:18

Roman
27.12.2017
07:48:09
Поидее в обработчиках ивентов живёт логика, которая создаёт пачку "сервисных" ивентов. Т.е. из ивента "Создан юзер" создаёт ивенты типа "Отправить e-mail с текстом таким-то на такой-то адрес", или "Отправить в телеграм такой-то вот такое-то сообщение". А вот уже эта сервиснные сообщения уходят в рэбит, и там их забирают сервисы, которые только умеют слать что-то куда-то и понятия не имеют о юзерах и домене вообще. Т.е. занимаются сугубо инфраструктурными вещами.

Maksim
27.12.2017
07:48:59
Не) эвент не указывает что сделать, а говорит что сделано

Roman
27.12.2017
07:49:07
Как вариант можно сделать отдельный типа сервис оркестрации, который будет из одного доменного события плодить тучу инфраструктурных - но думаю, что это не очень. Отлаживать можно заибаться.

Bohdan
27.12.2017
07:49:38

Roman
27.12.2017
07:49:40

Anton
27.12.2017
07:49:54

Roman
27.12.2017
07:50:08
Ну типа в обработчиках порождать инфраструктурные команды.
И проще

Maksim
27.12.2017
07:50:29
Казалось бы, при чём тут саги
Сервисные события от обычных отличаются, внезапно, ни чем

Bohdan
27.12.2017
07:51:14

Maksim
27.12.2017
07:51:45
Да тут Антон отдувается) а я так, набрасываю иногда)

Google

Bohdan
27.12.2017
07:52:10
ну я ж потому и говорю, что ты просто с попкорном сидишь)
в моем понимании ивент - это просто оповещение других частей системы
то есть, ивент, который запустит отправку мейла - не ня
ивент, который скажет "эй, нотификатор, у меня там юзер создался, раскидай оповещеньки" - уже норм

Maksim
27.12.2017
07:54:43
Ну так и есть в идеальном мире.
Как ивенты будут обрабатываться (и будут ли) породивший их модуль мало волнует. Он свою часть выполнил и сообщил.

Roman
27.12.2017
07:58:27

Bohdan
27.12.2017
07:59:21
инфраструктурные команды ничем не отличаются от обычных (в идеале)

Roman
27.12.2017
07:59:36
Объясню

Bohdan
27.12.2017
07:59:50
слева команда, справа команда)
в чем разница?)

Maksim
27.12.2017
07:59:51
у любителей обмазаться шинами чуток другой флоу.
и, да, команды отличаются ни чем

Sergey
27.12.2017
08:00:18

Bohdan
27.12.2017
08:00:22
я (для ивентов, правда) сделал так
у меня диспетчер команд из ивент рекордера выгребает ивенты и уже по их классам (наследуется от Event или AsyncEvent кидает либо в диспечтер (для синхронных) либо в гейтвей (для будущих асинхронных)

Roman
27.12.2017
08:01:09
Я хочу чтобы инфраструктура ничего не знала кроме того что она должна делать.
Т.е. сервис отправки имейлов - принимает на вход:
- мыло
- тему сообщения
- тело сообщения
- флаг, указывающий то, является ли тело плейнтекстом, либо хтмлем
и всё. он не знает ни про юзеров, ни про то что они создавались или что-то там ещё

Maksim
27.12.2017
08:01:15
шина -> команда -> сервис -> событие -> шина -> обработчики события (сервисы/саги. не важно) -> ....

Sergey
27.12.2017
08:01:32

Roman
27.12.2017
08:02:21

Bohdan
27.12.2017
08:02:43
у меня тоже)

Sergey
27.12.2017
08:02:50

Roman
27.12.2017
08:02:50
о юзерах, заказах и прочем дерьме

Google

Sergey
27.12.2017
08:03:02

Roman
27.12.2017
08:03:06
Чтобы мы одну архитектуру имели ввиду

Sergey
27.12.2017
08:03:43

Roman
27.12.2017
08:04:25
Связующее звено между инфраструктурой и доменом
А инфраструктура тупа

Sergey
27.12.2017
08:04:49
пришел ивент ProductPurchased, листенер его словил и попросил другой модуль что-то сделать

Bohdan
27.12.2017
08:05:22
Maksim поделись попкорном)

Sergey
27.12.2017
08:05:50
а теперь вернемся к вопросу чем это хранение ивентов в сингелтоне это зашквар?

Maksim
27.12.2017
08:05:54


Sergey
27.12.2017
08:07:08
у тебя есть модуль который позволяет запомнить что случился ивент. У тебя есть какой-то другой модуль который будет определять границу транзакции и отправлять все собранные события на обработку. Будут листенеры которые живут отдельно и ничего про сингелтон этот не знают. Будут сервисы-мэйлеры которые будут просить что-то делать ивент листенеры
вроде как все ж хорошо, где зашквар? ответственность разделена
удобно
не надо делать сложных юнит оф ворков и прочего
правда появляются нюансы при работе с исключениями, но это мелочи
и с CQS все хорошо)
p.s. я один раз пока только пробовал в сигелтоне хранить ивенты и в этом есть очень много плюсов, правда минусы тоже есть. Чаще я храню события прямо в сущности но мне тут очень не нравится то что у меня интерфейс сущности чуть-чуть загрязняется всякими releaseEvents
зато проще контролировать
но сложнее их потом все собирать в нужнома порядке