本文档展示了Cadence工作流服务的基本架构:它有三种不同的微服务:FE、MS和HS。那么它们是什么以及它们是如何协同工作的呢?
- FE表示前端服务。大多数用户只需要知道这是Cadence服务。它主要用于将请求路由到正确的历史记录服务(HS)或匹配服务(MS)
- 匹配服务用于将工作流/活动任务与工作流/活动工作者进行匹配。匹配从历史记录服务获得了任务。如果工作人员处于活动状态,则任务将立即匹配,这称为"同步匹配"。如果工人不可用,匹配将持续到数据库中,然后在工人返回时重新加载任务(称为"异步匹配")
- 历史服务是cadence工作流引擎的核心逻辑。与其他服务相比,这是最复杂的服务。文章的其余部分将解释它如何作为工作流引擎的核心服务与其他服务协同工作
- 图中缺少另一个内部服务"辅助服务"。通常我们称之为"系统工人服务"不同于客户端工作流工作程序和活动工作程序。该服务实现系统工作流以维护Cadence服务本身——是的,Cadence使用Cadence来实现自己。例如:存档工作流,当启用该功能时存档历史;父关闭策略工作流,当父工作流关闭时帮助关闭子WF;批处理工作流提供了执行批处理操作的功能,如发信号/终止等
因此,让我们以helloworld工作流为例来了解历史记录服务如何与其他服务协同工作。
- Golang Helloworld示例
- Java Helloworld示例
在正常情况下(没有超时),这个helloworld工作流将做出两个决定:
- 作为第一个决策,它安排一项活动
- 作为第二个决定,它完成了工作流程
func helloWorldWorkflow(ctx workflow.Context, name string) error {
ao := workflow.ActivityOptions{
...
}
ctx = workflow.WithActivityOptions(ctx, ao)
var helloworldResult string
// on executing this line, worker will respond decision result of scheduling the helloworld activity, and then `Get` will block until activity is completed by activity worker
err := workflow.ExecuteActivity(ctx, helloWorldActivity, name).Get(ctx, &helloworldResult)
if err != nil {
return err
}
// on executing this line, worker will respond decision result of completing the workflow
return nil
}
以下是历史服务如何与他人合作的时间表。这里使用括号来告诉历史事件是写的:[HistoryEventName]
- 当历史记录服务收到启动工作流请求时,它将工作流实体和历史记录保存到数据库中,并将决策任务(以及一些超时任务,我们将在未来讨论)保存到任务队列中[WorkflowExecutionStartedEvent][DecisionTaskScheduledEvent]
- 决策任务在内部也称为"转移决策任务"。(在度量中,会增加一个"TransferActiveTaskDecision"计数器)。因为它将被转移到匹配的服务。("活跃"意味着它在全球范围内处于活跃状态,我们将在未来的帖子中对此进行报道)
- 传输队列处理器不断轮询传输任务队列。在获得转移决策任务后,它将该任务推送到匹配引擎
- 假设存在helloworld工作流任务的活动工作流工作人员轮询(调用"PollForDecisionTask API")。然后工作人员将接收并处理该任务。[DecisionTaskStartedEvent]
- 作为决策任务的结果,将安排一个活动。"RespondDecisionTaskCompleted"API被调用到具有结果的历史记录服务
- 历史记录处理请求--它记录决策[DecisionTaskCompletedEvent][ActivityTaskScheduledEvent]
- 历史记录服务还将传输活动任务写入传输任务队列
- 传输任务队列处理器将轮询队列并获得任务。它将把活动任务推送到匹配引擎
- 同样,假设一个活动工作者是活动的——为helloworld活动调用"PollForActivityTask"API。工作人员将获得任务并进行处理。[ActivityTaskStartedEvent]
- helloworld活动很简单,工人会很快完成。它将通过调用"RespondActivityTaskCompleted"API请求返回结果
- 历史记录将处理该请求。它记录历史事件并安排另一个转移决策任务。[ActivityTaskCompletedEvent][DecisionTaskScheduledEvent]
- 再次重复决策任务处理——传输任务队列将其推送到匹配服务,然后工作流工作者将从匹配引擎中获取决策任务[DecisionTaskStartedEvent]
- 作为决策任务的结果,helloworld工作流将通过调用";RespondDecisionTaskComplete";API
- 当历史记录服务处理请求时,它会写下历史事件并完成工作流。[DecisionTaskCompletedEvent][WorkflowExecutionCompletedEvent]
这是helloworld工作流的示例历史记录。和上面完全一样。
- WorkflowExecutionStartedEvent
- 决策任务调度事件
- 决策任务启动事件
- 决策任务完成事件
- ActivityTaskScheduledEvent
- 活动任务已启动事件
- ActivityTaskCompletedEvent
- 决策任务调度事件
- 决策任务启动事件
- 决策任务完成事件
- 工作流执行完成事件
MySystems@Scaletalk解释了Temporal的总体架构以及选择这些架构的原因。