В последнее время я использую блестящую базу данных Event Store от блестящего Грега Янга, и это прекрасно. Но документация ужасна, она устарела, местами некорректна и распространяется через сайт. Иногда вам нужно просмотреть несколько нерелевантных страниц, чтобы сломать код документации!
В любом случае, не только документация, но и Java API отстой, и в большинстве случаев вместо этого вам приходится использовать HTTP API.
Я создал свой собственный Java API на основе HTTP API.
Я боролся с проекциями, и мне удалось создать несколько проекций (непрерывных, однократных, переходных), и они отлично работают, а результирующие потоки заполняются событиями, испускаемыми проекцией.
Итак, теперь я знаю, как мне создавать новые прогнозы, которые будут создавать потоки, заполненные моими желаемыми событиями, отфильтрованными по заданным критериям в предложении when.
Я также прочитал в документации, что мы можем выполнять временные запросы к хранилищу событий, но мы должны заполнить другую модель чтения с помощью подписки Catch-up, и я согласен с этим и знаю, что такое CQRS. Я использую MongoDB для создания моделей чтения для отчетов.
У меня возникают трудности с временными запросами. Я не мог найти никакой документации о том, как мне делать запросы. Но я догадался, что сначала нужно создать одноразовую проекцию для каждого запроса, а результаты передать новому потоку с именем query-{id}. Затем я немедленно пытаюсь прочитать события из нового потока запросов, но требуется время, чтобы создать поток запросов и заполнить его результирующими событиями. Итак, мой API для запросов создает проекцию и сразу же запрашивает события в результирующем потоке, но получает 404, что означает, что проекция еще не начала обрабатывать и создавать новый поток.
Итак, есть ли способ передать проекцию для хранения событий и запросить ее для событий?
Одна вещь, которую я понял, заключалась в том, что на самом деле нет способа запросить хранилище событий в режиме реального времени, но мы должны создать проекцию, которая создаст поток и заполнит его результатом, а значит, пока мы должны продолжать спрашивать, создан ли поток и был ли проекция сделана.
Я создаю новый поток для каждого из моих агрегатов, и все работает нормально. И у меня есть отдельный ограниченный контекст для отчетности всей системы, и он использует MongoDB, и это прекрасно работает. Но иногда мне нужно запросить события, чтобы проверить инварианты. Например, мне нужно проверить, является ли название продукта уникальным или нет, и выдать исключение. Чтобы сделать такую проверку, я должен создать отдельную модель чтения для агрегатов внутри каждого ограниченного контекста. Но я хочу делать такие запросы, просто запрашивая у хранилища событий все события ProductCreated с одним и тем же заголовком, а затем я хочу обработать все эти события, чтобы увидеть, есть ли у нас продукт с таким же заголовком.
Итак, как я могу запросить в хранилище событий все события ProductCreated, где заголовок равен некоторому значению, и немедленно получить результат?
Или, может быть, база данных хранилища событий не предназначена для таких случаев?!