客户跟踪正在进行的节奏工作流程
Tracking in progress cadence workflow by client
假设我们需要在用户完成 his/her cart.
后生成 order
这是我们生成订单的步骤:
- 生成一个处于挂起状态的订单(订单微服务)
- 授权用户信用(记账微服务)
- 将购物车状态设置为已关闭(购物车微服务)
- 批准订单(订单微服务)
为此,我们只需创建一个 Cadence 工作流程,为每个步骤调用 activity。
问题 1:如果用户再次打开购物车或刷新页面,客户端如何检测到该购物车的订单创建正在进行中?
(注意: 假设我们的工作流还没有被 worker 执行)
我对问题 1 的解决方案:在 运行 工作流之前创建订单并将其状态更改为 pending
,因此对于下一个请求,客户知道订单处于挂起状态。但是如果订单创建成功但启动工作流失败怎么办?它不是事务性的(订单创建和工作流程 运行)
如果此解决方案也是您的解决方案并且您接受其风险,请告诉我。我是节奏的新手。
问题2:如何在工作流程完成并准备好订单后通知客户?
请问有任何解决方案或文章或帮助吗?
问题1 : 有多种解决方案需要考虑:
1.1 在工作流中添加一个步骤,在调用订单微服务之前将订单更改为待定状态,而不是在工作流之外进行。它将避免一致性问题,您可以在工作流中添加重试以确保状态最终一致。
1.2 添加查询工作流状态的查询方法,User/UI可以queryWorkflow调用检索工作流状态查看订单状态。
1.3 将state放入workflow的SearchAttribute,User/UI可以调用describeWorkflow获取state
1.4。 https://github.com/uber/cadence/issues/3729实现后,可以像1.3
一样使用memo代替SearchAttribute
比较:如果您认为订单存储是订单状态的真实来源,则选择1.1,1.2~1.4将使工作流程成为事实的来源。这真的取决于你想如何设计系统架构。
如果 User/UI 期望低延迟,1.2 可能不是一个好的选择。因为 QueryCall 可能需要几秒钟才能 return.
1.3~1.4会多performant/fast。它只需要Cadence服务器调用数据库来获取工作流状态。
1.3 有另一个好处,如果你 Advanced visibility 启用了 ElasticSearch+Kafka 设置——你可以 search/filter/count 按订单状态的工作流。但是 1.3 的限制是你应该只放非常小的数据,比如 string/integer,而不是一团状态。
1.4 的好处是你可以放置一个 blob 状态。
为了防止用户多次完成购物车:
启动工作流时,使用与购物车关联的稳定工作流 ID。这样您就可以在允许他们 finalize/checkout 购物车之前调用 describeWF。一旦 StartWF 请求被接受,工作流就会持续存在。
如果有活动的工作流程(不是 failed/completed/timeouted),则表示购物车处于待处理状态。例如,如果购物车使用 UUID,那么您可以使用该 UUID+前缀来制作 workflowID。 Cadence 保证 workflowID uniqueness 因此不会出现为同一购物车启动两个工作流程的竞争条件。如果结帐失败,则用户可以再次提交结帐工作流程。
问题2 : 看你想“告知”什么。术语通知听起来像异步通知。如果是这种情况,您可以让另一个 activity 将通知发送到另一个微服务,或者将 signal 发送到另一个需要通知的工作流。
如果这里你指的是同步方式,比如在WebUI上显示,那么它可以像我提到的问题1.
的解决方案一样解决。
假设我们需要在用户完成 his/her cart.
后生成 order这是我们生成订单的步骤:
- 生成一个处于挂起状态的订单(订单微服务)
- 授权用户信用(记账微服务)
- 将购物车状态设置为已关闭(购物车微服务)
- 批准订单(订单微服务)
为此,我们只需创建一个 Cadence 工作流程,为每个步骤调用 activity。
问题 1:如果用户再次打开购物车或刷新页面,客户端如何检测到该购物车的订单创建正在进行中? (注意: 假设我们的工作流还没有被 worker 执行)
我对问题 1 的解决方案:在 运行 工作流之前创建订单并将其状态更改为 pending
,因此对于下一个请求,客户知道订单处于挂起状态。但是如果订单创建成功但启动工作流失败怎么办?它不是事务性的(订单创建和工作流程 运行)
如果此解决方案也是您的解决方案并且您接受其风险,请告诉我。我是节奏的新手。
问题2:如何在工作流程完成并准备好订单后通知客户?
请问有任何解决方案或文章或帮助吗?
问题1 : 有多种解决方案需要考虑:
1.1 在工作流中添加一个步骤,在调用订单微服务之前将订单更改为待定状态,而不是在工作流之外进行。它将避免一致性问题,您可以在工作流中添加重试以确保状态最终一致。
1.2 添加查询工作流状态的查询方法,User/UI可以queryWorkflow调用检索工作流状态查看订单状态。
1.3 将state放入workflow的SearchAttribute,User/UI可以调用describeWorkflow获取state
1.4。 https://github.com/uber/cadence/issues/3729实现后,可以像1.3
一样使用memo代替SearchAttribute比较:如果您认为订单存储是订单状态的真实来源,则选择1.1,1.2~1.4将使工作流程成为事实的来源。这真的取决于你想如何设计系统架构。
如果 User/UI 期望低延迟,1.2 可能不是一个好的选择。因为 QueryCall 可能需要几秒钟才能 return.
1.3~1.4会多performant/fast。它只需要Cadence服务器调用数据库来获取工作流状态。
1.3 有另一个好处,如果你 Advanced visibility 启用了 ElasticSearch+Kafka 设置——你可以 search/filter/count 按订单状态的工作流。但是 1.3 的限制是你应该只放非常小的数据,比如 string/integer,而不是一团状态。
1.4 的好处是你可以放置一个 blob 状态。
为了防止用户多次完成购物车: 启动工作流时,使用与购物车关联的稳定工作流 ID。这样您就可以在允许他们 finalize/checkout 购物车之前调用 describeWF。一旦 StartWF 请求被接受,工作流就会持续存在。 如果有活动的工作流程(不是 failed/completed/timeouted),则表示购物车处于待处理状态。例如,如果购物车使用 UUID,那么您可以使用该 UUID+前缀来制作 workflowID。 Cadence 保证 workflowID uniqueness 因此不会出现为同一购物车启动两个工作流程的竞争条件。如果结帐失败,则用户可以再次提交结帐工作流程。
问题2 : 看你想“告知”什么。术语通知听起来像异步通知。如果是这种情况,您可以让另一个 activity 将通知发送到另一个微服务,或者将 signal 发送到另一个需要通知的工作流。
如果这里你指的是同步方式,比如在WebUI上显示,那么它可以像我提到的问题1.
的解决方案一样解决。