@oop_ru

Страница 440 из 785
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
у меня вообще реализация некошерная, но под мои нужны норм если надо ивент без команды кинуть (хотя стараюсь так не делать) - можно напрямую в ивент диспатчер кинуть

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

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
Ну то бишь создал я юзера, предположим. Сохранил его в базу. Если он сохранился - вызываю диспетчер с ивентом "Создан новый юзер", который вызывет каких-то обработчиков (ну либо не вызывает, если их нет))). Далее, если обработчики успешно отработали (без эксепшенов) - коммичу транзакцию. Если нет - ролбэкаю, плюю ошибку.

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
ивенты это сайд эффект завершенного действия
Это не совсем так. Ивенты это source of truth.

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

И смс

и телега

и что угодно вообще

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

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

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

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

Roman
27.12.2017
07:49:40
Не) эвент не указывает что сделать, а говорит что сделано
Тогда я ошибся в терминологии) Утро) Это команда)

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
инфраструктурные команды ничем не отличаются от обычных (в идеале)

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
Пушо чтобы хэндлеры инстанциировать - надо либо сервис-локатор юзать (что зашквар), либо инстанциировать их ручками - что тоже зашквар.
не понял, причем тут хэндлеры, они ж уже потом. Сингелтон просто собирает ивенты и хранит их до окончания логической транзакции и уже потом ты оттуда прокидываешь их дальше (пабсабом каким)

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

Sergey
27.12.2017
08:02:50
Если что - у меня CQS - не CQRS Ии тем более не ES.
CQS на уровне отдельных методов, и в целом я ни CQRS и ES не имел ввиду. Разговор только о доменных событиях

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
Maksim поделись попкорном)
да не. тут просто в кучу как-то всё сгребли) думаю, разберутся скоро)

Sergey
27.12.2017
08:07:08
у тебя есть модуль который позволяет запомнить что случился ивент. У тебя есть какой-то другой модуль который будет определять границу транзакции и отправлять все собранные события на обработку. Будут листенеры которые живут отдельно и ничего про сингелтон этот не знают. Будут сервисы-мэйлеры которые будут просить что-то делать ивент листенеры

вроде как все ж хорошо, где зашквар? ответственность разделена

удобно

не надо делать сложных юнит оф ворков и прочего

правда появляются нюансы при работе с исключениями, но это мелочи

и с CQS все хорошо)

p.s. я один раз пока только пробовал в сигелтоне хранить ивенты и в этом есть очень много плюсов, правда минусы тоже есть. Чаще я храню события прямо в сущности но мне тут очень не нравится то что у меня интерфейс сущности чуть-чуть загрязняется всякими releaseEvents

зато проще контролировать

но сложнее их потом все собирать в нужнома порядке

Страница 440 из 785