首页 > 解决方案 > Cadence 中有哪些不同的服务以及历史服务如何作为核心工作流引擎工作?

问题描述

文档展示了 Cadence 工作流服务的基本架构:它具有三种不同的微服务:FE、MS 和 HS。那么它们是什么以及它们如何协同工作?

标签: cadence-workflowtemporal-workflow

解决方案


  • FE 代表前端服务。大多数用户只需要将此作为 Cadence 服务即可。它主要用于将请求路由到正确的历史服务(HS)或匹配服务(MS)
  • 匹配服务用于将工作流/活动任务与工作流/活动工作者进行匹配。匹配从历史服务中获取任务。如果工作人员处于活动状态,任务将立即匹配,称为“同步匹配”。如果工人不可用,匹配将持续到数据库中,然后在工人回来时重新加载任务(称为“异步匹配”)
  • 历史服务做cadence工作流引擎的核心逻辑。与其他服务相比,这是最复杂的服务。这篇文章的其余部分将解释它如何与其他服务一起工作,作为工作流引擎的核心服务。
  • 图中缺少另一个内部服务“worker service”。通常我们将其称为“sys worker service”,以区别于客户端工作流工作者和活动工作者。该服务实现了系统工作流来维护和 Cadence 服务本身——是的,Cadence 使用 Cadence 来实现自己。示例包括:启用该功能时存档历史记录的存档工作流程;父关闭策略工作流——它有助于在父工作流关闭时关闭子WF;批处理器工作流程,它提供了执行批处理操作的功能,例如信令/终止:等

因此,让我们以一个 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]
  • 决策任务在内部也称为“转移决策任务”。(在指标中有一个“<a href="https://github.com/uber/cadence/blob/7e60482b7c0fce1a63610e164660f079cdb59e0a/common/metrics/defs.go#L1576" rel="nofollow noreferrer">TransferActiveTaskDecision”计数器增加它)。因为它将被转移到匹配服务。(“活跃”表示它在全球域中处于活跃状态,我们将在以后的文章中介绍)
  • 传输队列处理器不断轮询传输任务队列。在获得转移决策任务后,它将任务推送到匹配引擎。
  • 假设 hello world 工作流任务有一个活动的工作流工作者轮询(调用“PollForDecisionTask API)”。然后工人将接收任务并处理它。[DecisionTaskStartedEvent]
  • 作为决策任务的结果,计划了一项活动。调用“RespondDecisionTaskCompleted”API 以获取结果的历史服务。
  • 历史处理请求——它写下决定[DecisionTaskCompletedEvent][ActivityTaskScheduledEvent]
  • 历史服务还将一个传输活动任务写入传输任务队列
  • 传输任务队列处理器将轮询队列并获得任务。它将活动任务推送到匹配引擎。
  • 同样,假设活动工作者处于活动状态 - 为 hello world 活动调用“PollForActivityTask”API。工人将得到任务并处理它。[ActivityTaskStartedEvent]
  • helloworld 活动很简单,worker 会很快完成它。它将通过调用“RespondActivityTaskCompleted”API 请求返回结果
  • 历史将处理请求。它记下历史事件并安排另一个传输决策任务。[ActivityTaskCompletedEvent] [DecisionTaskScheduledEvent]
  • 再次重复决策任务处理——传输任务队列将其推送到匹配服务,然后工作流工作者将从匹配引擎获取决策任务。[DecisionTaskStartedEvent]
  • 作为决策任务的结果,helloworld 工作流将通过调用“RespondDecisionTaskComplete”API 来做出完成工作流的决定。
  • 当历史服务处理请求时,它会记下历史事件并完成工作流程。[DecisionTaskCompletedEvent][WorkflowExecutionCompletedEvent]

这是 helloworld 工作流的示例历史记录。它与上面完全相同。

  • WorkflowExecutionStartedEvent
  • 决策任务计划事件
  • 决策任务启动事件
  • 决策任务完成事件
  • ActivityTaskScheduledEvent
  • ActivityTaskStartedEvent
  • ActivityTaskCompletedEvent
  • 决策任务计划事件
  • 决策任务启动事件
  • 决策任务完成事件
  • 工作流执行完成事件

推荐阅读