【问题标题】:Foreign key constraint in mirco-service-oriented architecture面向微服务架构中的外键约束
【发布时间】:2020-12-30 08:01:45
【问题描述】:

给定以下两个微服务,产品和购物车,它们连接到事件总线。 每当创建、更新或删除产品时,都会发出一个事件,以便购物车微服务可以更新其产品数据的副本。

现在,如何实现用户购物车中仍然引用的任何产品都不能删除的业务需求。

到目前为止我的想法:

  • 通过向购物车微服务添加额外的依赖项,在产品微服务中实现该逻辑。我不喜欢这种解决方案,因为它增加了耦合并引入了循环依赖。

任何推荐的方法或模式来解决这个问题?

【问题讨论】:

  • 删除是什么意思?在企业中,很少有东西被“删除”

标签: microservices event-driven-design


【解决方案1】:

我会让购物车服务发布添加商品、删除商品、购物车关闭事件的事件流。产品服务可以直接订阅这些事件并跟踪产品是否在购物车中。

因为在事件发布和消费之间存在固有的延迟,这当然会增加产品在删除后但在购物车服务收到事件之前被添加到购物车的机会;然后,购物车服务将发布购物车更改事件,该事件将引用已删除的项目。

为了处理这种情况,我会:

  • 强制在一定时间后关闭购物车
  • 至少在该期间将产品删除视为待处理。然后,删除事件是“我们打算删除此产品”事件,它向购物车服务发出信号以阻止添加它,但不会影响当前的购物车
  • 自挂起的产品删除和该商品的最后一次添加到购物车事件中的较晚者经过购物车自动关闭时间后,删除才会生效

这并不能完全消除(例如,如果购物车服务停机时间超过自动关闭时间)服务之间的最终一致性,但会大大降低这种可能性。所以这留下了两个选择,这是企业必须决定的:

  • 他们可以通过提供服务(可以是产品,可以是购物车,可以是新服务,可以是产品和购物车的合并)来消除最终的一致性,这将是协调点。请注意,如果此服务已关闭(或无法访问),则会阻止将商品添加到购物车中。

  • 他们可以接受一个小风险,即如果购物车服务已关闭,客户将能够添加已删除的商品。在这种情况下,大概有一种方法可以向客户发送道歉信息和某种形式的补偿(例如,X 下次购买时的优惠券)。

应该采用哪种方法纯粹是商业决策;鉴于失去该协调服务可能对业务产生影响,我强烈怀疑几乎所有企业都更喜欢后者。

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2021-04-13
    • 2018-08-16
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多