Saga,在哪里存储聚合状态
Saga, where to store aggregate status
我是 saga 的新手。
这是一个简单的场景:
- 用户点击"Create Order":一个订单被创建(一开始保持它的状态=NEW)
- 用户完成订单填写后,单击保存 --> 现在状态为已提交
- 当另一个检查订单并验证它时,必须进行一个过程。仅当其他一些服务被调用并给出它们的 GO 时,订单才有效。
整个工作流程是:
NEW
-> SUBMITTED
.
- 从
SUBMITTED
开始,用户可以取消提交并将订单切换回 NEW
。
- 验证可以将订单状态设置为
VALIDATED
或 REJECTED
。
- 如果
REJECTED
原始用户必须在再次将其提交至 VALIDATION 之前修复他的订单。
所以我需要避免订单在 VALIDATION
进行时回滚到 NEW
。
我的问题是,对于第 3 步,是否更好:
- 将订单状态更新为 PENDING,引发事件并启动 saga(具有自己的状态和流程编排以及例程单)?
- 从订单聚合中删除状态并将其放入 saga(因此 saga 从第 1 步开始)? saga 命名为 OrderSaga 并封装了从开始到结束的所有过程,而不仅仅是需要外部服务的部分,即分布式事务)。
- 还有别的吗? (感谢链接到博客或 google 群组邮件)
谢谢
DDD
是关于领域的,所以首先您需要了解业务需求。那么,让我们看看规则是什么:
- 可以创建新订单
- 可以提交已创建的订单,但需要经过验证
The validation process
可能需要一些时间,可以取消。如果取消订单可以重新提交
The validation process
可以拒绝订单或接受订单
- 如果订单被拒绝,可以在更正后再次提交
- 如果订单被接受,它将被发送到下一个流程,无法提交或更正。
也就是说,我会将这两个过程(订单创建+创建和订单验证)分开。此外,我会在 OrderAggregate
上保留一个状态 属性,用于强制执行其不变量。状态可以是:
new
:订单创建后或取消验证或拒绝订单后
submitted
:提交验证后
sent
: 被验证过程接受后。
如果您需要其他行为,您应该添加新状态仅。
OrderValidationSaga
还会有一个内部状态,用于跟踪从外部服务收到的外部响应。假设我们需要使用两个外部服务。状态将是一个具有两个属性的对象:service1IsOk
和 service2IsOk
。当任何服务表示订单无效时,saga 将拒绝订单,无论内部进度如何,并重置其内部状态。当服务说 OK 时,saga 在内部将其标记为 OK,然后检查所有服务是否都 OK。如果他们没问题,它会告诉聚合发送订单。然后聚合将订单标记为 sent
并发出事件。 If/when 进程被取消,saga 重置其内部状态。
请注意,如果您使用 CQRS
,则所有状态更改都是通过发送命令和引发事件来完成的。 saga 将订阅事件并将适当的命令发送到聚合。
有一篇精品文章here。
我是 saga 的新手。
这是一个简单的场景:
- 用户点击"Create Order":一个订单被创建(一开始保持它的状态=NEW)
- 用户完成订单填写后,单击保存 --> 现在状态为已提交
- 当另一个检查订单并验证它时,必须进行一个过程。仅当其他一些服务被调用并给出它们的 GO 时,订单才有效。
整个工作流程是:
NEW
->SUBMITTED
.- 从
SUBMITTED
开始,用户可以取消提交并将订单切换回NEW
。 - 验证可以将订单状态设置为
VALIDATED
或REJECTED
。 - 如果
REJECTED
原始用户必须在再次将其提交至 VALIDATION 之前修复他的订单。
所以我需要避免订单在 VALIDATION
进行时回滚到 NEW
。
我的问题是,对于第 3 步,是否更好:
- 将订单状态更新为 PENDING,引发事件并启动 saga(具有自己的状态和流程编排以及例程单)?
- 从订单聚合中删除状态并将其放入 saga(因此 saga 从第 1 步开始)? saga 命名为 OrderSaga 并封装了从开始到结束的所有过程,而不仅仅是需要外部服务的部分,即分布式事务)。
- 还有别的吗? (感谢链接到博客或 google 群组邮件)
谢谢
DDD
是关于领域的,所以首先您需要了解业务需求。那么,让我们看看规则是什么:
- 可以创建新订单
- 可以提交已创建的订单,但需要经过验证
The validation process
可能需要一些时间,可以取消。如果取消订单可以重新提交The validation process
可以拒绝订单或接受订单- 如果订单被拒绝,可以在更正后再次提交
- 如果订单被接受,它将被发送到下一个流程,无法提交或更正。
也就是说,我会将这两个过程(订单创建+创建和订单验证)分开。此外,我会在 OrderAggregate
上保留一个状态 属性,用于强制执行其不变量。状态可以是:
new
:订单创建后或取消验证或拒绝订单后submitted
:提交验证后sent
: 被验证过程接受后。
如果您需要其他行为,您应该添加新状态仅。
OrderValidationSaga
还会有一个内部状态,用于跟踪从外部服务收到的外部响应。假设我们需要使用两个外部服务。状态将是一个具有两个属性的对象:service1IsOk
和 service2IsOk
。当任何服务表示订单无效时,saga 将拒绝订单,无论内部进度如何,并重置其内部状态。当服务说 OK 时,saga 在内部将其标记为 OK,然后检查所有服务是否都 OK。如果他们没问题,它会告诉聚合发送订单。然后聚合将订单标记为 sent
并发出事件。 If/when 进程被取消,saga 重置其内部状态。
请注意,如果您使用 CQRS
,则所有状态更改都是通过发送命令和引发事件来完成的。 saga 将订阅事件并将适当的命令发送到聚合。
有一篇精品文章here。