当前位置: 首页 > 知识库问答 >
问题:

按客户端跟踪进行中的节奏工作流

濮阳
2023-03-14

假设我们需要在用户完成购物车后生成订单。

这是我们生成订单的步骤:

  • 生成一个处于挂起状态的订单(订单微服务)
  • 授权用户信用(会计微服务)
  • 将购物车的状态设置为关闭(购物车微服务)
  • 批准订单(订单微服务)

为此,我们只需创建一个节奏工作流,为每个步骤调用一个活动。

问题1:如果用户再次打开购物车或刷新页面,客户端如何检测到购物车正在创建订单?(注意:假设我们的工作流还没有被工人执行)

我的问题1解决方案:在运行工作流之前,创建订单并将其状态更改为pending,因此对于下一个请求,客户机知道订单处于pending状态。但是,如果订单创建成功,但启动工作流失败,会发生什么?它不是事务性的(订单创建和工作流运行)

如果这个解决方案也是你的解决方案,并且你接受了它的风险,请告诉我。我对节奏不熟悉。

问题二:工作流程做好了,订单准备好了,怎么通知客户?

请问有什么解决方案或者文章或者帮助吗?

共有1个答案

卢文博
2023-03-14

问题1:需要考虑多种解决方案:

1.1在调用订单微服务之前,在工作流中添加一个将订单更改为挂起状态的步骤,而不是在工作流之外进行。它将使您免于一致性问题,您可以在工作流中添加重试以确保状态最终保持一致。

1.2添加查询方式查询工作流状态,User/UI可以进行queryWorkflow调用检索工作流状态查看订单状态。

1.3将状态放入工作流的SearchAttribute中,用户/UI可以调用describeWorkflow来获取状态

1.4.https://github.com/uber/cadence/issues/3729实现后,可以用memo代替1.3那样的SearchAt⃣

比较:如果你认为订单存储是订单状态真相的来源,那么1.1是你的选择,1.2~1.4将使工作流成为真相的来源。这实际上取决于您希望如何设计系统架构。

如果用户/UI期望低延迟,1.2可能不是一个好的选择。因为QueryCall可能需要几秒钟才能返回

1.3~1.4的性能/速度会快很多。它只需要Cadence服务器发出一个DB调用来获取工作流状态。

如果您使用ElasticSearch Kafka设置启用了高级可见性,1.3还有另一个好处——您可以按订单状态搜索/过滤/统计工作流。但是1.3的限制是你应该只放非常小的数据,比如字符串/整数,而不是状态的blob。

1.4的好处是你可以放一个状态块。

要防止用户多次完成购物车:启动工作流时,请使用与购物车关联的稳定工作流ID。因此,您可以在允许他们完成/结帐购物车之前调用describeWF。一旦接受StartWF请求,工作流就会持久化。如果存在活动工作流(未失败/完成/超时),则表示购物车处于挂起状态。例如,如果购物车使用UUID,则可以使用该UUID前缀生成工作流ID。Cadence保证workflowID的唯一性,因此不存在为同一购物车启动两个工作流的竞争条件。如果签出失败,则用户可以再次提交签出工作流。

问题2 :这取决于你想要的“通知”。术语通知听起来像异步通知。如果是这种情况,可以有其他活动将通知发送到另一个微服务,或将信号发送到需要通知的其他工作流。

如果这里的意思是同步方式,如在WebUI上显示,那么它可以像我提到的问题1的解决方案中一样解决。

 类似资料: