bya*_*223 0 cadence-workflow temporal-workflow
活动任务很容易理解,因为它正在执行一个活动……但什么是决策任务?工作人员是否从一开始(使用已完成活动的记录)贯穿整个工作流程,直到它遇到下一个需要做的“有意义”的事情,同时对接下来需要做的事情做出“决定”?
TLDR;当接收到新的外部事件时,工作流任务负责确定要执行的下一个命令。
Temporal/Cadence 工作流由外部工作人员执行。因此,了解工作流必须采取哪些后续步骤的唯一方法是在每次有新信息可用时询问它。将此类请求分派给工作人员的唯一方法是将工作流任务放入任务队列。工作流工作者将其取出,从其缓存中取出工作流,并对其应用新事件。应用新事件后,工作流执行生成一组新命令。在工作流代码被阻止并且无法进行任何前进后,工作流任务将报告为已完成返回给服务。要执行的命令列表包含在完成请求中。
工作人员是否从一开始(使用已完成活动的记录)贯穿整个工作流程,直到它遇到下一个需要做的“有意义”的事情,同时对接下来需要做的事情做出“决定”?
这取决于工作者是否在其 LRU 缓存中具有工作流对象。如果工作流在缓存中,则不需要恢复,工作流任务中只包含新事件。如果对象没有被缓存,那么整个事件历史都会被传送,并且工作人员必须从头开始执行工作流代码以使其达到当前状态。重放过去事件时产生的所有命令都是先前产生的命令的副本并且被忽略。
以上意味着在工作流的生命周期内必须执行多个工作流任务。例如,对于按顺序调用两个活动的工作流:
a();
b();
Run Code Online (Sandbox Code Playgroud)
每次状态转换都会执行任务:
-> workflow task at the beginning: command is ScheduleActivity "a"
a();
-> workflow task when "a" completes: command is ScheduleActivity "b"
b();
-> workflow task when "b" completes: command is CompleteWorkflowExecution
Run Code Online (Sandbox Code Playgroud)
在回答中,我使用了 Cadence的temporal.io分支采用的术语。以下是 Cadence 概念如何映射到 Temporal 概念:
决策是工作流决策的缩写。
决策是工作流状态机中从一种状态到另一种状态的移动。本质上,您的工作流代码定义了一个状态机。因为状态机本质上是确定性的,所以工作流代码必须是确定性的。
一个决策任务是为工人执行工作流代码生成决策的任务。
假设我们有这个工作流代码:
public string sampleWorkflowMethod(...){
var result = activityStubs.activityA(...)
if(result.startsWith("x"){
Workflow.sleep(...)
}else{
result = activityStubs.activityB(...)
}
return result
}
Run Code Online (Sandbox Code Playgroud)
从 Cadence SDK 的角度来看,代码是一个状态机。
假设我们有一个执行,activityA 的结果是xyz,这样执行就会转到 sleep 分支。
在上述工作流执行期间会发生什么:
xyz给 Cadence 服务。xyz。工作流决策是编排其他实体,如活动/子工作流/计时器等。
决策(工作流)任务是与 Cadence 服务通信,告诉下一步要做什么。例如,启动/取消某些活动,或完成/失败/继续作为新工作流。
每个工作流执行始终最多有一个未完成的(正在运行/待处理)决策任务。在另一个已经开始但尚未完成的情况下开始一个是不可能的。
在编写 Cadence 工作流时,决策任务的性质会导致一些不确定性问题。有关更多详细信息,您可以参考文章。
在每个决策任务上,Cadence Client SDK 可以从头开始“重放”代码,例如,执行activityA。但是,这种重放模式不会再次生成调度活动A 的决定。因为客户知道已经安排了活动A。
但是,工作人员不必从一开始就运行代码。Cadence SDK 足够智能,可以将状态保存在内存中,稍后唤醒以继续之前的状态。这被称为“工作流粘性缓存”,因为工作流在工作主机上有一段时间的粘性。
1. WorkflowStarted
2. DecisionTaskScheduled
3. DecisionTaskStarted
4. DecisionTaskCompleted
5. ActivityTaskScheduled <this schedules activityA>
6. ActivityTaskStarted
7. ActivityTaskCompleted <this records the results of activityA>
8. DecisionTaskScheduled
9. DecisionTaskStarted
10. DecisionTaskCompleted
11. TimerStarted < this schedules the timer>
12. TimerFired
13. DecisionTaskScheduled
14. DecisionTaskStarted
15. DecisionTaskCompleted
16. WorkflowCompleted
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2081 次 |
| 最近记录: |