【问题标题】:Foreign key constraint in mirco-service-oriented architecture面向微服务架构中的外键约束
【发布时间】:2020-12-30 08:01:45
【问题描述】:
给定以下两个微服务,产品和购物车,它们连接到事件总线。
每当创建、更新或删除产品时,都会发出一个事件,以便购物车微服务可以更新其产品数据的副本。
现在,如何实现用户购物车中仍然引用的任何产品都不能删除的业务需求。
到目前为止我的想法:
- 通过向购物车微服务添加额外的依赖项,在产品微服务中实现该逻辑。我不喜欢这种解决方案,因为它增加了耦合并引入了循环依赖。
任何推荐的方法或模式来解决这个问题?
【问题讨论】:
标签:
microservices
event-driven-design
【解决方案1】:
我会让购物车服务发布添加商品、删除商品、购物车关闭事件的事件流。产品服务可以直接订阅这些事件并跟踪产品是否在购物车中。
因为在事件发布和消费之间存在固有的延迟,这当然会增加产品在删除后但在购物车服务收到事件之前被添加到购物车的机会;然后,购物车服务将发布购物车更改事件,该事件将引用已删除的项目。
为了处理这种情况,我会:
- 强制在一定时间后关闭购物车
- 至少在该期间将产品删除视为待处理。然后,删除事件是“我们打算删除此产品”事件,它向购物车服务发出信号以阻止添加它,但不会影响当前的购物车
- 自挂起的产品删除和该商品的最后一次添加到购物车事件中的较晚者经过购物车自动关闭时间后,删除才会生效
这并不能完全消除(例如,如果购物车服务停机时间超过自动关闭时间)服务之间的最终一致性,但会大大降低这种可能性。所以这留下了两个选择,这是企业必须决定的:
应该采用哪种方法纯粹是商业决策;鉴于失去该协调服务可能对业务产生影响,我强烈怀疑几乎所有企业都更喜欢后者。