Architecture 使用事件源在DDD/CQR中一次捕获大量聚合的创建

Architecture 使用事件源在DDD/CQR中一次捕获大量聚合的创建,architecture,domain-driven-design,cqrs,event-sourcing,Architecture,Domain Driven Design,Cqrs,Event Sourcing,我有一个聚合,它使用一个文件,并因此创建了大量其他聚合 e、 g。 工厂聚合事件源 产品聚合事件源 List<Product> Factory.CreateProducts(specifications); 对我来说,这种方法有一些基本问题,其中最大的问题是: 正在同时修改多个聚合。 通过消息总线承载10000多条消息并在读取模型生成器中独立处理这些消息的开销。 作为替代方案,我可以将整个事件作为消息总线中的一个事件推送,但这将意味着一个潜在的巨大事件,它将随着生成的聚合数量的增加

我有一个聚合,它使用一个文件,并因此创建了大量其他聚合

e、 g。 工厂聚合事件源 产品聚合事件源

List<Product> Factory.CreateProducts(specifications);
对我来说,这种方法有一些基本问题,其中最大的问题是:

正在同时修改多个聚合。 通过消息总线承载10000多条消息并在读取模型生成器中独立处理这些消息的开销。 作为替代方案,我可以将整个事件作为消息总线中的一个事件推送,但这将意味着一个潜在的巨大事件,它将随着生成的聚合数量的增加而增大

我处理这个问题的方法是常见的,还是完全没有抓住要点? 在DDD/CQRS体系结构中,如果事件源用于聚合的持久性,那么处理该问题的正确方法是什么


p、 与问题无关,但我正在使用C、MongoDb进行持久化,使用Windows服务总线,但切换到RabbitMQ。

从技术上讲,您所做的符合传奇的想法;但即使是一个传奇故事,你也会产生10万个以上的事件来创造10万个以上的产品。您是否考虑过在第一次发出命令时懒散地创建产品

var product = aggregateRepository.find(productId);
if (!product) {
   var productSpecs = db.fetchProductSpecs(productId);
   product = factory.CreateProduct(command.specs);
}
product.someHandler(...
或者,在后台创建产品的速度要慢一些,这样就不会使读取模型更新程序饱和

假设您对产品的建模是正确的,您确实希望每个产品有一个事件来宣布其创建

var product = aggregateRepository.find(productId);
if (!product) {
   var productSpecs = db.fetchProductSpecs(productId);
   product = factory.CreateProduct(command.specs);
}
product.someHandler(...