Я немного баловался с источником событий, но я не эксперт. Мне не особенно нравится идея отдельного « stream », представляющего снимок. Это не большая часть потока, поскольку он хранит только последний снимок. В моем проекте Shuttle.Recall , который все еще находится в зачаточном состоянии, я сохраняю снимки как обычные события домена, но они специально помечаются как снимки, а последняя версия снимка сохраняется отдельно для загрузки, а затем События после этой версии применяются. Я нахожу некоторые преимущества в том, что вы можете добавить некоторые функции и к снимкам.
Когда вы используете снимки как чисто техническое улучшение производительности, это может не принести особой пользы вашему домену. Если моментальный снимок не принадлежит агрегату / домену, то как можно было бы увлажнить агрегат из моментального снимка?
В некоторых случаях снимок может быть очень большой частью домена. При просмотре своей ежемесячной банковской выписки вы не найдете все транзакции (события) со дня, когда вы открыли свой счет. Вместо этого у нас есть начальный баланс (снимок) с новыми транзакциями (событиями) за этот месяц. Таким образом, событие «MonthEndProcessed» вполне может быть моментальным снимком.
Я также не на самом деле покупаю аргумент, что если моментальный снимок содержит ошибку, вы не можете ее исправить, поскольку поток событий неизменен. Что произойдет, если ваше событие содержит ошибку? Вы не можете это исправить? Эти ошибки в идеале не должны превращаться в производственную систему, но если они это делают, их следует исправить. В любом случае, неизменность для меня связана с типичным взаимодействием с системой. Мы обычно не вносим изменения в событие, как только оно произошло.
В некоторых случаях может быть даже полезно вернуться назад и изменить некоторые события на более новую версию. Они должны быть сведены к минимуму и в идеале их следует избегать, но, возможно, в некоторых случаях это может быть прагматичным.
Но, как я уже сказал ... Я все еще учусь:)