微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决DDD - 多个聚合优惠券和购买

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

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

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

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

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

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

谢谢

解决方法

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

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

看看由 Udi Dahan 制作的关于传奇模式的在线视频 - 或者它的文档?

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。