我有一个聚合,它消耗了一个文件,并因此创建了大量其他聚合。
例如:
工厂汇总(事件来源)
产品聚合(事件来源)
List<Product> Factory.CreateProducts(specifications);
对CreateProducts
的调用产生一个事件:FactoryCreatedProducts
,一旦我保存工厂聚合,它将被保存到事件流中。调用还会生成10000+ Product
聚合,在实例化后,每个聚合将包含一个ProductCreated
事件,该事件将被保存到事件流中。
目前,我的代码如下:
var factory eventstream.get(command.FactoryId);
var products = factory.CreateProducts(command.specs);
foreach(var product in products) {eventstream.save(product.PendingEvents);}
eventstream.save(factory.PendingEvents);
对我来说,这种方法有一些根本的问题,其中最大的问题是:
作为另一种选择,我可能会在消息总线中将整个事件作为一个事件进行推送,但这意味着一个潜在的巨大事件将随着生成的聚合数量的增加而增大。
我处理这个问题的方法是普通的吗,还是我完全没有意识到这一点?在DDD/CQRS体系结构中,什么是正确的处理方法,其中事件源用于聚合的持久性?
附注:与问题无关,但我使用C#,MongoDb作为持久性,Windows,但切换到RabbitMQ。
发布于 2015-04-22 03:42:43
从技术上讲,您所做的工作非常符合Saga的概念;但是即使作为一个Saga,您也会生成10k+事件来创建10k+产品。您是否考虑过在第一次发出命令时懒洋洋地创建产品?
var product = aggregateRepository.find(productId);
if (!product) {
var productSpecs = db.fetchProductSpecs(productId);
product = factory.CreateProduct(command.specs);
}
product.someHandler(...
或者,在后台创建更慢的产品,这样不会使您的阅读模型更新器饱和。
假设您对产品的建模是正确的,您确实希望每个产品有一个事件来宣布它的创建。
https://stackoverflow.com/questions/26041946
复制相似问题