DDD - 多个聚合(优惠券和购买)

DDD - Multiple Aggregates (Coupons And Purchases)

我正在构建一个 DDD/ES 系统,管理员可以在其中生成优惠券代码,供消费者公开共享和使用。

每张优惠券都有一个最大折扣金额,由该优惠券的所有用户“共享”。一个例子是“优惠券 123 每次使用最多 100,000 美元可享受 5% 的折扣”。一旦达到最大金额,优惠券将自动失效。优惠券可能还规定了哪些商品有资格使用该优惠券购买。

到目前为止,我将优惠券和购买作为单独的 AR。有问题吗?

  1. 如何在一次交易不更新多个聚合的情况下进行购买时更新优惠券剩余金额?由于这是关于金钱的,因此感觉最终一致性可能会导致收入损失。应该由域服务负责还是由 Saga 负责?

  2. 如何验证使用优惠券购买的商品是否符合条件?在继续购买之前,请在命令处理程序中询问优惠券 AR:couponAR.AreValidItems(request.PurchaseDetails)

  3. 我想跟踪每次购买分配了多少优惠券?这应该是另一个 AR (CouponUsageAR) 还是只是 Coupon AR (CouponUsed) 上的一个事件?

谢谢

在实践中,让一个事务(在数据库意义上)跨越多个事件流是相当困难的。一种更常用的方法是在传奇失败的情况下使用 saga 模式 和补偿事件,并在其中使用 correlation identifiers匹配事件发生的不同实体的事件。

例如,您可能有一个更新剩余优惠券的 saga,如果成功则继续执行购买。如果购买失败,则 saga 需要 post 优惠券事件流上的补偿事件,以使其恢复到 saga 开始时的状态。

看看 Udi Dahan 介绍 saga 模式的在线视频或相关文档?

关于强一致性和最终一致性的问题,请教领域专家(毕竟这是领域驱动设计)的问题:

which is worse: a coupon code delivering more discounts than its limit, or not being able to take an order?

如果答案是他们宁愿执行优惠券限制而失去销售,那么就需要高度的一致性。如果他们宁愿接受订单,那么就需要最终的一致性。值得注意的是,有一种简单的方法可以防止优惠券代码超出其限制:永不下订单。