首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用事件源捕获DDD/CQRS中一次创建大量聚合体

利用事件源捕获DDD/CQRS中一次创建大量聚合体
EN

Stack Overflow用户
提问于 2014-09-25 15:06:39
回答 1查看 370关注 0票数 1

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

例如:

工厂汇总(事件来源)

产品聚合(事件来源)

代码语言:javascript
运行
复制
List<Product> Factory.CreateProducts(specifications);

CreateProducts的调用产生一个事件:FactoryCreatedProducts,一旦我保存工厂聚合,它将被保存到事件流中。调用还会生成10000+ Product聚合,在实例化后,每个聚合将包含一个ProductCreated事件,该事件将被保存到事件流中。

目前,我的代码如下:

代码语言:javascript
运行
复制
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);

对我来说,这种方法有一些根本的问题,其中最大的问题是:

  1. 正在同时修改多个聚合。
  2. 在消息总线上传输10000+消息并在读取模型生成器中独立处理它们的开销。

作为另一种选择,我可能会在消息总线中将整个事件作为一个事件进行推送,但这意味着一个潜在的巨大事件将随着生成的聚合数量的增加而增大。

我处理这个问题的方法是普通的吗,还是我完全没有意识到这一点?在DDD/CQRS体系结构中,什么是正确的处理方法,其中事件源用于聚合的持久性?

附注:与问题无关,但我使用C#,MongoDb作为持久性,Windows,但切换到RabbitMQ。

EN

回答 1

Stack Overflow用户

发布于 2015-04-22 03:42:43

从技术上讲,您所做的工作非常符合Saga的概念;但是即使作为一个Saga,您也会生成10k+事件来创建10k+产品。您是否考虑过在第一次发出命令时懒洋洋地创建产品?

代码语言:javascript
运行
复制
var product = aggregateRepository.find(productId);
if (!product) {
   var productSpecs = db.fetchProductSpecs(productId);
   product = factory.CreateProduct(command.specs);
}
product.someHandler(...

或者,在后台创建更慢的产品,这样不会使您的阅读模型更新器饱和。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26041946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档