Хранение событий при использовании Event Sourcing

Я читал об источнике событий, и хотя я нашел это вполне естественным подходом для решения нескольких проблем, я не совсем понял, как хранить события на практике.

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

В его подходе у нас есть таблица Events с одним id и JSON data поле. Это дает большую свободу, поскольку мы можем хранить любые данные JSON и, следовательно, мы можем хранить различные события.

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

Итак, когда мы храним события для использования источников событий, как мы должны действовать? Я вижу три варианта:

  1. Следуя идее, используемой для доменных событий в статье и сохраняйте все внутри одной таблицы.

  2. Создайте одну таблицу на событие. Недостатком здесь является то, что нам нужно отслеживать события для каждого агрегата, и для каждого агрегата могут быть различные виды событий. Так что это легко может привести к огромному количеству столов.

  3. Создайте одну таблицу для каждого агрегата и сохраните там все события для этого агрегата. Хотя в итоге мы получаем разные виды событий, объединенные в одной таблице, все они связаны с одним и тем же агрегатом.

Какой из этих трех вариантов будет более разумным? Если нет, какой будет правильный способ хранения событий при использовании источников событий?

1 ответ

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

Похоже, FUD.

Все события выглядят одинаково, верно? Большой двоичный объект данных и некоторые столбцы метаданных, которые полезны для размещения большого двоичного объекта в контексте. У тебя нет особо умных отношений, чтобы бежать; найти все события в потоке, найти все события, вызванные командой (которые все равно будут в одном потоке), вот и все.

Все события, вероятно, принадлежат одному логическому представлению.

Физически вы можете хотеть бездельничать, чтобы вы могли масштабироваться. Вы можете рассмотреть то, что Уди Даан говорил в CQRS, но разные слайды. Но основная идея здесь заключается в том, что разделение / разбиение - это проблема, которую производители баз данных уже решают, поэтому позвольте им сделать это.

Обсуждение магазинов событий Postgres:

Другие вопросы по тегам