当前位置: 首页 > 知识库问答 >
问题:

Cadence决策任务到底是什么?

农鸿德
2023-03-14

活动任务很容易理解,因为它正在执行活动...但什么是决策任务?工作人员是否从一开始就运行工作流(使用已完成活动的记录),直到它遇到下一个需要做的“有意义”的事情,同时对下一步需要做什么做出“决定”?

共有2个答案

东方震博
2023-03-14

顶级域;当收到新的外部事件时,工作流任务负责确定要执行的下一个命令。

时态/节奏工作流由外部工作人员执行。因此,了解工作流必须采取哪些后续步骤的唯一方法是,每次有新信息可用时都询问它。将此类请求分派给工作人员的唯一方法是将工作流任务放入任务队列中。工作流工作线程选取它,从其缓存中获取工作流,并向其应用新事件。应用新事件后,工作流将执行,生成一组新命令。在工作流代码被阻止且无法进行任何向前推进后,工作流任务将报告为已完成并返回给服务。要执行的命令列表包含在完成请求中。

工作人员是否从一开始就运行工作流(使用已完成活动的记录),直到它遇到下一个需要做的“有意义”的事情,同时对下一步需要做什么做出“决定”?

这取决于工作线程的 LRU 缓存中是否有工作流对象。如果工作流位于缓存中,则不需要恢复,并且工作流任务中仅包含新事件。如果未缓存对象,则将传送整个事件历史记录,并且工作线程必须从头开始执行工作流代码以使其达到当前状态。重播过去的事件时生成的所有命令都是以前生成的命令的副本,将被忽略。

以上意味着在工作流的生命周期中,必须执行多个工作流任务。例如,对于按顺序调用两个活动的工作流:

a();
b();

将为每个状态转换执行这些任务:

-> 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

在答案中,我使用了 temporal.io 节奏分叉采用的术语。以下是节奏概念如何映射到时间概念:

    < li >决策任务-
令狐辉
2023-03-14

决策是工作流决策的缩写。

决策是工作流状态机中从一个状态到另一个状态的移动。本质上,您的工作流代码定义了一个状态机。这个状态机必须是一个用于重放的确定性状态机,所以工作流代码必须是确定性的。

决策任务是工作人员执行工作流代码以生成决策的任务。

注意:在时间上,决策被称为“命令”,工作流决策任务被称为产生“命令”的“工作流任务”

假设我们有以下工作流代码:

java prettyprint-override">public string sampleWorkflowMethod(...){
  var result = activityStubs.activityA(...)
  if(result.startsWith("x"){
     Workflow.sleep(...)
  }else{
     result = activityStubs.activityB(...)
  }
  
  return result
}

从Cadence/Temoral SDK的观点来看,代码是一个状态机。

假设我们有一个执行,activityA的结果是< code>xyz,因此该执行将转到sleep分支。

  • 工作流代码定义了状态机,它是静态的。
  • 工作流执行将根据输入/结果/和代码逻辑决定如何在运行时从一种状态移动到另一种状态
  • 决策是Cadence内部的抽象。在工作流执行过程中,当它从一种状态改变到另一种状态时,决策是该运动的结果。
  • 抽象基本上是定义当执行从一个状态移动到另一个状态时需要做什么——调度活动、计时器或子WF等。
  • 决策需要是确定性的——对于相同的输入/结果,工作流代码应该做出相同的决策——调度活动A或B必须相同。

上述工作流执行期间会发生什么:

    < li>Cadence服务安排第一个决策任务,将其分派给工作流工作人员 < Li > worker执行第一个决策任务,并将调度活动的决策结果返回给Cadence服务。然后工作流停留在那里等待。 < li >调度activityA的结果是,Cadence service生成一个activity任务,并将该任务分派给activity worker < li >活动工作器执行活动,并将结果< code>xyz返回给Cadence service。 < li >作为接收活动结果的结果,Cadence服务调度第二个决策任务,并分派给工作流工作器。 工作流工作者执行第二个决策任务,并向Cadence服务响应调度定时器的决策结果 < li >收到决策任务响应时,Cadence service会安排一个计时器 < li >当计时器触发时,Cadence服务调度第三个决策任务,并再次分派给工作流工作器 < li >工作流工作者执行第三个决策任务,并用结果< code>xyz响应成功完成工作流执行的结果。

>

  • 工作流决策是协调那些其他实体,如活动/ChildWorkflow/Timer/等。

    决策(工作流)任务是与Cadence服务进行通信,告诉下一步要做什么。例如,开始/取消一些活动,或完成/失败/继续作为新的工作流。

    对于每个工作流执行,最多始终有一个未完成的(正在运行/挂起的)决策任务。不可能在一个开始时开始另一个,但尚未完成。

    在编写Cadence工作流时,决策任务的性质会导致一些不确定性问题。有关更多详细信息,请参阅本文。

    在每个决策任务上,Cadence Client SDK可以从头开始“重放”代码,例如执行活动A。但是,这种重放模式不会再次生成调度活动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
    

  •  类似资料:
    • 我想实现一个延迟任务,发现了一个cadence cron例子,如何用cadence实现一个延迟任务?

    • 主要内容:JSP的由来,Servlet与JSP异同点,JSP相对于Servlet的优点JSP(Java Server Pages)是一种动态网页开发技术。JSP 文件就是在传统的 HTML 文件中插入 Java 代码和 JSP 标签,后缀名为 。 JSP 与 PHP、ASP、ASP.NET 等语言类似,都运行在服务端。通常返回给客户端的就是一个 HTML 文件,因此只要有浏览器就能查看 JSP 页面。 JSP 使用 JSP 标签在 HTML 网页中插入 Java 代码,标签通常以

    • 直到我在旧存储库中随机检查 ,我才听说过这个文件,它就是一个我自己没有编辑过也从未见过的文件。我不知道它是如何到达那里的。 似乎很常见 - 主要是如何删除它(例如这里和这里)。 这个文件是什么,是什么创建了它?

    • 基本上,为什么有这个术语? 还有,接口是什么意思?

    • 译者:lhc741 作者:Jeremy Howard,fast.ai。感谢Rachel Thomas和Francisco Ingham的帮助和支持。 我们推荐使用notebook来运行这个教程,而不是脚本,点击这里下载notebook(.ipynb)文件。 Pytorch提供了torch.nn、torch.optim、Dataset和DataLoader这些设计优雅的模块和类以帮助使用者创建和训练

    • 任务是项目管理中最小单位。任务是一个具体的工作,有明确的负责人和截止时间,比如需要在某个特定的时间段内完成某项工作。