Если вы не обрабатываете события в Readmodel одновременно, блокировка не нужна.Это тот случай, когда у вас есть единственный экземпляр модели чтения, возможный в микросервисе, который запрашивает события и последовательно обрабатывает их.
Если у вас синхронная модель чтения (то есть в том же процессе, что и модель записи /)Агрегируйте), тогда, скорее всего, вам понадобится блокировка.
Важно помнить, что Readmodel, скорее всего, отличается от Writemodel.Может быть много типов Writemodel, события которых проецируются в одной и той же модели чтения.Например, в интернет-магазине вы можете иметь ListOfProducts
, который проецирует событие из Vendor
и из Product
Агрегатов.Это означает, что, когда мы говорим о модели чтения, мы не можем просто ссылаться на «Агрегат», потому что не задействован ни один Агрегат.В случае электронной коммерции, когда мы говорим «Совокупность», мы можем ссылаться на Product
Совокупность или Vendor
Совокупность.
Но что блокировать?Здесь зависит от технологии базы данных.Вы должны заблокировать самую маленькую затронутую читаемую сущность или коллекцию, которую можно заблокировать.В модели чтения, которая состоит из списка продуктов (читай сущностей, а не агрегатов!), Когда событие, которое затрагивает только один продукт, следует заблокировать только этот продукт (т. Е. ProductTitleRenamed
).
Если событие влияетбольше продуктов, то вы должны заблокировать всю коллекцию.Например, VendorWasBlocked
влияет на все продукты (он должен удалить все продукты от этого поставщика).
Вам нужна блокировка для событий, которые имеют неидемпотентные побочные эффекты, для случая, когда средство обновления Readmodelпроисходит сбой во время обработки события, если вы хотите повторить попытку / возобновить с того места, где оно ушло.Если у события есть идемпотентные побочные эффекты, его можно безопасно повторить.
Чтобы узнать, откуда возобновить работу в случае сбоя модели чтения, вы можете сохранить внутри модели чтения последовательность последнего обработанного события.В этом случае, если обновление сущности завершается успешно, последовательность последнего обработанного события также сохраняется.Если произойдет сбой, вы знаете, что событие не было обработано.