Нужна защита от дурацких вызовов архитектуре Event Sourcing с CosmosDB

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

Кто-то утверждает, что вместо хранения событий в чем-то вроде хранилища таблиц и материализации представлений на основе событий и снимков мы должны:

Просто транслируйте события в журнал в Azure Monitor, чтобы провести аудит.

Мы можем вносить изменения в объект домена немедленно в ответ на команду и использовать канал изменений в качестве источника событий для материализованных представлений.

Он не видит преимуществ даже в материализованном представлении. Почему бы просто не использовать запрос? Аргумент в том, что мы не ожидаем большого трафика.

Он хочет вести весь журнал аудита, сохраняя события в журнале монитора Azure - просто журнале приложения. Вместо этого эти команды должны просто напрямую изменять представление сущности в космосе, и мы использовали бы канал изменений из CosmosDB в качестве событий объекта домена, или мы бы создавали новые события на его основе через подписчиков на этот поток.

Действительно ли это выгодный подход? Можете ли вы придумать какие-либо причины, по которым мы не захотим этого делать? Похоже, мы здесь что-то потеряем.

Он говорит, что нам больше не нужно беспокоиться о возможной согласованности, поскольку у нас будет немедленная согласованность.

Каждая оцененная мной эталонная реализация НЕ делает это так, как он предлагает. Я не очень разбираюсь в преимуществах / недостатках парадигмы поиска событий / CQRS, поэтому сейчас я в растерянности .. Сейчас я яростно исследую

Это концептуальная проблема, поэтому здесь не так много примеров кода. Однако вот несколько ссылок, которые, кажется, подтверждают мой подход.

https://medium.com/@thomasweiss_io/planet-scale-event-sourcing-with-azure-cosmos-db-48a557757c8d

https://sajeetharan.com/2019/02/03/event-sourcing-with-azure-eventhub-and-cosmosdb/

https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing


person Michael J    schedule 13.07.2019    source источник
comment
плюс один только за классное название   -  person Alex Gordon    schedule 31.07.2019


Ответы (2)


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

Однако я могу вас предупредить, что вторая статья в вашем списке очень слабая и, скорее всего, приведет вас ко многим трудностям. Роль Event Hub здесь совершенно неясна, и он ничего не объясняет о проекциях и моделях чтения (то, что вы называете «материализованными представлениями»). Только очень ограниченное количество вариантов использования может работать с получением только одной сущности по идентификатору и без возможности выполнения запроса для нескольких сущностей. Это также, вероятно, отвечает на вашу озабоченность по поводу наличия моделей чтения вообще. Они вам понадобятся очень скоро, когда вы впервые начнете разбираться в том, как получить список сущностей на основе некоторого условия (запроса).

Использование CosmosDb в качестве хранилища событий вполне возможно, как описано в первой статье, если вы можете управлять соответствующими затратами. Просто не забудьте установить TTL для изменения канала на -1, иначе вы не сможете воспроизвести свои прогнозы, когда вам это нужно.

Обобщить:

  • Ведение журнала аудита может осуществляться без использования источников событий, но необходимо обеспечить надежную публикацию событий, предпочтительно в той же транзакции, что и обновление состояния объекта. Часто это сложно или невозможно, но вы можете согласиться с риском несоблюдения требований аудита. Вы также можете основывать свой журнал аудита на канале изменений CosmosDb, просто собирая изменения документов и записывая их где-нибудь.
  • Поиск событий - мощный метод, но у него есть как плюсы, так и минусы. Наиболее распространенное предубеждение против использования источника событий - сложность его реализации. Возможно, это не будет большой проблемой, если у вас есть команда, имеющая некоторый опыт в создании систем, основанных на событиях. Если у вас нет такой команды, вы можете создать небольшой спайк, чтобы получить некоторый опыт.
  • Если вы не получите полной поддержки от команды для использования поиска событий, вы позже получите всю вину, если что-то пойдет не так. И в какой-то момент все пойдет не так, особенно с небольшим опытом в этой области.
  • Потратьте некоторое время на чтение книг и пробуйте что-то самостоятельно, прежде чем сойти с ума в продакшене.
  • Не используйте Event Hub для чего-либо, для чего он не предназначен. Концентратор событий - это мощный транспорт для приема событий с ограниченным TTL, и его следует использовать для этой цели.
  • Не используйте хранилище таблиц в качестве хранилища событий, если только вы не читаете сущности только по идентификатору. Я использовал его в продакшене для такого сценария, и он работал (в некоторой степени), но вы не можете проектировать модели чтения оттуда.
person Alexey Zimarev    schedule 17.07.2019
comment
хотелось бы получить руководство по решениям для хранения cosmosdb / table для проекций - person Alex Gordon; 31.07.2019
comment
Как я уже сказал, хранилище таблиц не будет работать для прогнозов, потому что нет возможности создать поток обновлений в реальном времени. Для CosmosDb доступны статьи, но вкратце - вам нужно создать коллекцию, в которую вы помещаете свои события, которая будет служить хранилищем событий, а затем подписаться на канал изменений, который будет обслуживать ваши прогнозы. Канал изменений CosmosDb может быть настроен на неограниченный размер, что позволяет использовать такие функции, как полное воспроизведение и т. Д. - person Alexey Zimarev; 01.08.2019
comment
Спасибо. Я просто собирался попросить у вас рекомендации по книге по поиску событий, и увидел, что вы написали книгу !!! - person Alex Gordon; 01.08.2019
comment
Какая польза от возможности повторять события? можешь привести пример? - person Alex Gordon; 01.08.2019
comment
Воспользовавшись воспроизведением, вы можете восстановить прошлое. Допустим, вы создали заказ со свойствами, а затем со временем обновили несколько свойств. При выборе источника событий у вас будет событие для каждого обновления (версии заказа). Вы можете восстановить состояние порядка на конкретное время в прошлом. - person ravi tella; 03.06.2020

Простое практическое правило - не использовать продукты для задач, для которых они не были созданы.

Azure Monitor не предназначен для хранения данных домена приложения. Azure Monitor предназначен для хранения данных телеметрии из ваших приложений и служб и предоставляет такие функции, как предупреждения и другие типы интеграции с инструментами DevOps для управления работой и работоспособностью ваших приложений.

Есть простая причина, по которой вы смогли найти статьи об источниках событий с помощью Cosmos DB и почему об этом говорится в наших собственных документах. Потому что он был разработан для такого использования. Cosmos DB легко настроить как хранилище событий только для добавления для ваших приложений и использовать канал изменений для отправки сообщений в других приложениях или службах или, в вашем случае, для поддержания материализованного состояния представления объектов домена в вашем приложении.

person Mark Brown    schedule 07.06.2020