必须处理在事件源最终一致系统中不存在的聚合 Id

问题描述 投票:0回答:1

我目前正在纠结如何在聚合不存在的情况下确保聚合最终一致

假设我有一个订单服务可以为我创建产品订单,我有一个产品服务可以管理这些产品

我有两个分布在多个服务上的聚合,假设我将产品添加到订单中,我将创建一个命令来创建一个事件来设置订单和一个来添加产品,如果提供的 ID 会发生什么产品订单不存在?

// 我尝试了什么

我确实认为我可以发送一个事件来说明该产品在添加到订单后不存在,这反过来会解决问题,但是,据我所知,我需要创建一个基于聚合,但产品服务不会有基于该 Id

的聚合

我想的另一种方式是说从订单我会触发和事件说 ProductRequestedForOrder,然后如果产品服务有聚合它会触发一个事件来声明它存在,然后订单服务会创建另一个事件说 ProductAddedToOrder

感谢您提供的任何帮助,谢谢

domain-driven-design event-sourcing eventual-consistency dddd
1个回答
0
投票

如果提供给产品订单的 ID 不存在怎么办?

在业务层面应该发生什么?这是你需要弄清楚的第一件事。也许企业想拒绝订单;或者他们可能想接受订单,即使它是否可以完成并不明显。也许订单应该被视为草稿,允许客户更正错误。

因为您已经从订单信息中分发了产品信息(即,因为您不能在处理订单时lock产品),所以在产品更改和订单处理可见更改之间总会有一些延迟.

这总是意味着订单的处理有可能与产品目录的某些计划外更改不一致。

如果这是个阻碍,那么你就不能设计一个以分布式方式处理这些信息的系统。

如果这不是一个阻碍,那么您实际上只是在尝试设计一个解决方案,以正确平衡延迟对帐的成本与您的其他考虑因素。

大体上,您将最终得到 Ordering 拥有它需要的产品信息的本地缓存副本,并在其自己的业务逻辑中使用该本地副本。然后你只需要发现正确的缓存策略来使用(我们是否尝试为每个订单刷新缓存?如果产品目录不可用,我们是否可以重新使用我们的旧数据?如果产品目录不可用,我们是否需要停止处理订单我们掌握的信息太旧了?等等)。

推荐阅读:Race Conditions Don't Exist (Udi Dahan, 2010)

© www.soinside.com 2019 - 2024. All rights reserved.