问题 1:有多种解决方案需要考虑:
1.1 在工作流中添加一个步骤,在调用订单微服务之前将订单更改为待处理状态,而不是在工作流之外进行。它将使您免于一致性问题,您可以在工作流中添加重试以确保状态最终保持一致。
1.2 增加查询工作流状态查询方法,用户/UI可以通过queryWorkflow调用获取工作流状态,查看订单状态。
1.3 将状态放入工作流的SearchAttribute中,用户/UI可以通过describeWorkflow调用获取状态
1.4. https://github.com/uber/cadence/issues/3729实现后,可以像1.3那样使用memo代替SearchAttribute
比较:如果您认为订单存储是订单状态的真相来源,则选择1.1,1.2 ~1.4将使工作流成为真相来源。这实际上取决于您要如何设计系统架构。
如果用户/UI 期望低延迟,1.2 可能不是一个好的选择。因为 QueryCall 可能需要几秒钟才能返回。
1.3~1.4 会更高效/更快。它只需要 Cadence 服务器进行数据库调用即可获取工作流状态。
如果您通过 ElasticSearch+Kafka 设置启用了高级可见性,那么 1.3 有另一个好处——您可以按订单状态搜索/过滤/计数工作流。但是 1.3 的限制是你应该只放置非常小的数据,比如字符串/整数,而不是状态块。
1.4 的好处是你可以放置一个状态块。
防止用户多次完成购物车:启动工作流时,使用与购物车关联的稳定工作流ID。这样您就可以在允许他们完成/结帐购物车之前调用 describeWF。一旦 StartWF 请求被接受,工作流就会持续存在。如果有活动的工作流程(未失败/完成/超时),则表示购物车处于待处理状态。例如,如果购物车使用 UUID,那么您可以使用该 UUID+前缀来制作工作流ID。Cadence 保证workflowID 的唯一性,因此不会出现为同一个购物车启动两个工作流的竞争条件。如果结帐失败,则用户可以再次提交结帐工作流程。
问题2:这取决于“通知”您想要什么。术语通知听起来像异步通知。如果是这种情况,您可以让另一个活动将通知发送到另一个微服务,或者将信号发送到另一个需要通知的工作流。
如果在这里您的意思是像在 WebUI 上显示的同步方式,那么它可以像我在问题 1中提到的解决方案一样解决。