小编Jay*_*Jay的帖子

在 DDD 和 CQRS 中,正确设计具有多个聚合更新的同步读取模型

假设我有2个骨料StaffShop我有AA读模型StaffModel 包含在一个非规范化视图店铺信息(shopId,姓名,地址等)。

业务规则是在单个请求中创建 aStaff和 a Shop,所以我有一个CreateStaffService创建 Staff 并触发StaffCreatedEvent,然后CreateShopService侦听器StaffCreatedEvent,创建一个Shop,然后触发ShopCreatedEvent

在读取模型方面,我有 4 种设计同步器服务的方法:

  1. 订阅StaffCreatedEvent,创建记录StaffModel。然后订阅ShopCreatedEvent,更新StaffModel使用人员 ID上的商店信息。

  2. ShopCreatedEvent包含人员信息,同步器服务订阅事件并一次性插入完整的读取模型。但是员工信息与Shop聚合无关,是否可以将其包含在事件中?

  3. 建模StaffModelShopModel单独更新模型以响应相应的聚合事件。

  4. 包装CreateStaffServiceCreateShopService在单个事务中,触发一个StaffAndShopCreatedEvent

我个人更喜欢选项 2 和选项 4,因为选项 1 很难确保StaffCreatedEvent总是在 之前到达ShopCreatedEvent

请分享您对这个主题的想法和经验。谢谢

更新:

为了避免使用序列号的无序事件消耗,假设我使用数据库序列生成一个序列号,每次递增 1,然后假设我的订阅者消耗事件 1,所以最后处理的事件序列为 1。然后生产者按顺序发布事件 2 、事件 3 和事件 4,并且仅在当前事务成功时才发送事件。所以如果事务 2 创建了一个序号 2,但事务失败并回滚,则事件 …

domain-driven-design cqrs

2
推荐指数
1
解决办法
2371
查看次数

标签 统计

cqrs ×1

domain-driven-design ×1