【问题标题】:DDD - Multiple Aggregates (Coupons And Purchases)DDD - 多个聚合(优惠券和购买)
【发布时间】:2021-01-19 07:12:32
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

  • 您认为Coupon AR 会有多忙?多个用户同时使用同一张优惠券有什么风险?这将决定在同一个 TX 中修改两者是否成本太高。从简单且一致的开始,然后根据需要走向最终的一致性。
  • 谢谢@plaix。这完全取决于产品的成功程度。如果产品成功,肯定会出现并发使用的爆发。特别是因为优惠券计划的有效期很短,例如24 小时。

标签: domain-driven-design e-commerce event-sourcing


【解决方案1】:

在实践中,让一个事务(在数据库意义上)跨越多个事件流是相当困难的。更常用的方法是在 saga 失败的情况下使用带有补偿事件的 saga 模式,并在事件中使用 correlation identifiers 来匹配不同的他们偶然发现的实体。

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

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

【讨论】:

    【解决方案2】:

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

    哪个更糟糕:优惠券代码提供的折扣超过其限制,或者无法接受订单?

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

    【讨论】:

    • 谢谢@Levi。我想我知道这个问题的答案是什么,但你是对的,我应该在构建一些东西来解决它之前确认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2018-07-12
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多