Как надежно сохранить событие в Azure CosmosDB и отправить его в Event Grid ровно один раз - PullRequest
0 голосов
/ 16 октября 2018

Я экспериментирую с шаблоном получения событий / cqrs с использованием бессерверной архитектуры в Azure.

Я выбрал базу данных документов Cosmos DB для хранилища событий и таблицы событий Azure для отправки событий денормализаторам.

Как мне добиться, чтобы события надежно доставлялись в сетку событий ровно один раз, когда событие сохраняется в Cosmos DB?Я имею в виду, если доставка в Event Grid не удалась, она не должна храниться в хранилище событий, не так ли?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Посмотрите на Cosmos Db Change Feed.Встроенный сборщик событий / очередь для каждого изменения в БД.Вы можете зарегистрировать одного или нескольких слушателей / обработчиков.Т.е. функции Azure.

Это может быть именно то, что вы просите.

Некоторые предполагают, что вы можете перейти непосредственно к базе данных космоса и прикрепить сетку событий на обратной стороне ленты изменений.

0 голосов
/ 17 октября 2018

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

В CQRS приложение разделено на стороны записи / команды и чтения / запроса (это длинное видео может помочь).Вы пытаетесь объединить две части в одну, понижение, если хотите.Вместо этого вы должны рассматривать их отдельно, с разными моделями (см. Проектирование на основе домена ).

Сторона записи не должна зависеть от результата со стороны чтения.Это означает, что после того, как хранилище событий сохранит события, будет выполнена запись.Кроме того, сторона «Запись» должна содержать все данные, необходимые для выполнения своей работы, - генерацию событий на основе бизнес-правил.

Если у вас есть разные технологии в части «Запись и чтение», тогда ваша «Чтение»сторона должна быть отделена от стороны записи , то есть она должна выполняться в отдельном потоке / процессе.

Один из способов сделать это - создать поток / процесс, который прослушивает добавление к событиюхранить, извлекать новые события, а затем публиковать их в сетке событий.Если этот процесс завершается неудачно или перезапускается, он должен возобновиться с того места, где остановился.Я не знаю, поддерживает ли CosmosDB это, но MongoDB (также база данных документов) имеет rslog, что вы можете tail получить новые события за несколько миллисекунд.

...