2016-07-28 5 views
5

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

Поиск немного в Интернете Я нашел this article от Vaughn Vernon, говорящий о простом подходе к хранению агрегатов в DDD. Хотя речь идет не только о поиске источников событий, он предназначен для хранения доменных событий с использованием PostgreSQL.

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

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

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

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

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

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

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

ответ

6

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

Звучит как FUD.

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

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

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

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

Смежные вопросы