Распространено ли хранилище событий между различными микросервисами?Или существует несколько независимых баз данных хранилищ событий для каждого микросервиса и одного общего посредника событий?
Каждый микросервис должен записывать в свое собственное хранилище событий, с их точки зрения.Это может означать отдельные экземпляры или отдельные разделы внутри одного экземпляра.Это позволяет независимо масштабировать микросервисы.
Если первым вариантом является решение, используя CQRS, я могу теперь предположить, что база данных каждого микросервиса предназначена для стороны запросов, в то время как общее хранилище событий включено.командная сторона.Это неправильное предположение?
Kinda.Как я писал выше, каждый микросервис должен иметь свое собственное хранилище событий (или раздел внутри общего экземпляра).Микросервис не должен добавлять события в другое хранилище событий микросервиса.
Что касается событий чтения, я думаю, что события чтения в целом должны быть разрешены.Опрос хранилища событий - самое простое (и, на мой взгляд, лучшее) решение для распространения изменений на другие микросервисы.Он имеет преимущество в том, что удаленный микросервис опрашивает с той скоростью, с которой он может, и какие события он хочет.Это можно очень хорошо масштабировать, создавая копии хранилища событий настолько, насколько это необходимо.
В некоторых случаях вы бы не хотели публиковать каждое событие домена из хранилища событий.Некоторые говорят, что могут существовать события внутреннего домена, от которых другие микросервисы не должны зависеть.В этом случае вы можете пометить события как свободные (или нет) для внешнего потребления.
Самым чистым решением для распространения изменений в микросервисе является наличие активных запросов, на которые могут подписаться другие микросервисы.Преимущество состоит в том, что логика проецирования не проникает в другие микросервисы, но также имеет тот недостаток, что микросервис-эмитент должен определять + реализовывать эти запросы;Вы можете сделать это, когда заметите, что другие микросервисы дублируют логику проецирования.Примером этого запроса является общая цена заказа в приложении электронной коммерции.У вас может быть такой запрос WhatIsTheTotalPriceOfTheOrder
, который публикуется каждый раз, когда элемент добавляется / удаляется из / обновляется в Заказе.
И поскольку мы находимся в теме: сколько повторов ячто делать в случае одновременной записи в поток с использованием оптимистической блокировки?
Столько, сколько вам нужно, т.е. до тех пор, пока запись не будет успешной.Вы можете иметь ограничение в 99999, просто чтобы обнаружить, когда что-то ужасно неправильно с механизмом повтора.В любом случае, параллельная запись должна быть повторена только тогда, когда запись выполняется в одно и то же время в том же потоке (для одного экземпляра Aggregate), а не для всего хранилища событий.