Хранение событий при использовании Event Sourcing
Я читал об источнике событий, и хотя я нашел это вполне естественным подходом для решения нескольких проблем, я не совсем понял, как хранить события на практике.
Ища немного в Интернете, я нашел эту статью Вона Вернона, рассказывающую о простом подходе к хранению агрегатов в DDD. Хотя речь идет не о поиске событий, он нацелен на способ хранения событий домена с использованием PostgreSQL.
В его подходе у нас есть таблица Events
с одним id
и JSON data
поле. Это дает большую свободу, поскольку мы можем хранить любые данные JSON и, следовательно, мы можем хранить различные события.
Но наличие всех событий, соответствующих всем агрегатам в одной таблице, заставляет меня немного волноваться.
Итак, когда мы храним события для использования источников событий, как мы должны действовать? Я вижу три варианта:
Следуя идее, используемой для доменных событий в статье и сохраняйте все внутри одной таблицы.
Создайте одну таблицу на событие. Недостатком здесь является то, что нам нужно отслеживать события для каждого агрегата, и для каждого агрегата могут быть различные виды событий. Так что это легко может привести к огромному количеству столов.
Создайте одну таблицу для каждого агрегата и сохраните там все события для этого агрегата. Хотя в итоге мы получаем разные виды событий, объединенные в одной таблице, все они связаны с одним и тем же агрегатом.
Какой из этих трех вариантов будет более разумным? Если нет, какой будет правильный способ хранения событий при использовании источников событий?
1 ответ
Но наличие всех событий, соответствующих всем агрегатам в одной таблице, заставляет меня немного волноваться.
Похоже, FUD.
Все события выглядят одинаково, верно? Большой двоичный объект данных и некоторые столбцы метаданных, которые полезны для размещения большого двоичного объекта в контексте. У тебя нет особо умных отношений, чтобы бежать; найти все события в потоке, найти все события, вызванные командой (которые все равно будут в одном потоке), вот и все.
Все события, вероятно, принадлежат одному логическому представлению.
Физически вы можете хотеть бездельничать, чтобы вы могли масштабироваться. Вы можете рассмотреть то, что Уди Даан говорил в CQRS, но разные слайды. Но основная идея здесь заключается в том, что разделение / разбиение - это проблема, которую производители баз данных уже решают, поэтому позвольте им сделать это.
Обсуждение магазинов событий Postgres: