如何模拟账户余额检查? (最终一致性/事件驱动架构是否可能?)

How to model account balance check? (Is it possible with eventual consistency / event driven architecture?)

如果有 2 个有界上下文:SpendingAccount management,如何防止用户花费超过他的余额?

我理解当我们有单个产品的 Order > Payment > Shipment 序列时的情况,但这里它更像是 Order > Balance Check > Shipment 我不明白如何在其他有界上下文中检查余额并确定用户永远不会花比他更多的钱。

这种情况甚至有可能以最终一致性的方式解决吗?我更喜欢它最终的一致性。如果不是,safe 选项是否可以在 Spending 有界上下文中保持平衡?

[更新] 我没有提到,我正在考虑事件驱动架构中的解决方案,其中有界上下文仅通过事件交换信息。

在你的情况下,余额检查的最终一致性是不合适的。

要求:在我们知道客户可以付款之前不要发货。

因此您有一个严格的业务需求,即装运过程必须等待帐户余额检查过程的响应。如果余额检查服务中断,则无法继续装运。

在其他业务场景中,您可以继续流程的一部分,让另一部分通过服务之间的进程外消息传递实现最终一致性。在您的情况下,您不能为流程的检查余额部分执行此操作。

为了进一步复杂化,您的过程将是:

订单 > 查看余额 > 发货 > 扣除资金。

你不想在发货之前扣除资金以防因为某些原因导致发货失败,但你肯定不想在检查余额之前发货。

为此,我将介绍 'earmark' 或 'reserved funds' 的概念。

因此,您的“支出”上下文将向“客户经理”上下文发送 'reserve funds' 请求并等待响应。该响应可以包含 'reservation of funds' 的相关 ID。您的账户管理服务需要了解“实际余额”和“预留资金”的概念才能计算“可用余额”。

一旦您的发货完成,您可以发送 'confirmation' 给账户管理并引用相关 ID,以便账户管理可以调整“实际余额”并删除“预留资金”。在我看来,这一步可以最终保持一致。