假设我们需要在用户完成购物车后生成订单。
这是我们生成订单的步骤:
为此,我们只需创建一个节奏工作流,为每个步骤调用一个活动。
问题1:如果用户再次打开购物车或刷新页面,客户端如何检测到购物车正在创建订单?(注意:假设我们的工作流还没有被工人执行)
我的问题1解决方案:在运行工作流之前,创建订单并将其状态更改为pending
,因此对于下一个请求,客户机知道订单处于pending状态。但是,如果订单创建成功,但启动工作流失败,会发生什么?它不是事务性的(订单创建和工作流运行)
如果这个解决方案也是你的解决方案,并且你接受了它的风险,请告诉我。我对节奏不熟悉。
问题二:工作流程做好了,订单准备好了,怎么通知客户?
请问有什么解决方案或者文章或者帮助吗?
问题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的解决方案中一样解决。
可以运行不需要连接到cadence服务器的本地活动。是否有适当的方式在本地运行工作流,以防发生cadence中断?我正在使用Go客户端。
如何通过给定工作流 ID 的 CLI 或 Java 客户端查询工作流最终结果
我正在设计一个工作流,打算使用cadence工作流引擎和Java客户端。看起来uber正在积极使用Go,因此Go拥有比Java Client更好的文档、Activity和其他类。这是真的吗?
temporal.io如何与cadenceworkflow.io?如果根据节奏工作流服务启动一个新项目,应该使用什么?
如何根据信号改变节奏工作流程中的睡眠持续时间?这是使用java客户端的正确方法吗? 我没有发现取消和重新安排工作流Hibernate计时器的其他可能性
我设置了一个贝宝立即购买按钮。这个向导很棒,也很容易,但是我如何跟踪我的用户是否从我的网站上付费呢?每个用户都有一个唯一的用户ID。在贝宝支付成功,有没有一种方法重定向回我的网站与用户ID在查询字符串?还是有更安全的方式或检查?