03 Temporal 详细介绍

news2024/12/23 6:00:39

前言

在后端开发中,大家是否有遇到如下类型的开发场景

  • 需要处理较多的异步事件
  • 需要的外部服务可靠性较低
  • 需要记录保存某个对象的复杂状态

        在以往的开发过程中,可能更多的直接使用数据库、定时任务、消息队列等作为基础,来解决上面的问题。然而即便如此,在代码开发中,也会有很多代码跟业务无关,比如 外部服务低可靠性情况下的重试,多异步事件下的程序逻辑组织等。最终会影响开发效率,并且可能会降低代码后期的维护性。

针对上面的场景,抽象为 工作流 模式的话,可以减轻开发成本以及维护成本

工作流介绍

定义:指业务过程的部分或整体在计算机应用环境下的自动化。是对工作流程及其各操作步骤之间的业务规则的抽象、概括描述。

主要解决的问题:为了实现某个业务目标,利用计算机在多个参与者之间按照某种预订的规则自动传递问文档、信息或者任务。

适用场景

工作流通常适用于,有状态的、异步、长时间执行等特性的业务场景,比较典型的场景包括

  • 视频、音频、图片处理工作流
  • 订单、审批流程
  • 数据处理流水线
  • 自动化运维

常见工作流框架

工作流框架还是比较多的,按照语言分类的话,有

  • Java: jBPM、Activiti、SWF
  • PHP: Tpflow、PHPworkflow
  • Go: Cadence(Cadence由Uber开发并开源,Maxim Fateev是Cadence的主架构师)、Temporal(Maxim Fateev为了推广Workflow编排引擎的商业化,另立门户创建了Temporal)

Temporal 工作流基本概念

1、原理

在业务模块当中按规则编写 Workflow 流程以及其具体的 Activity,并注册到 worker 当中,启动 worker 外部⽤户触发 Workflow,Temporal 编排 workflow 形成⼀系列的 task 送到队列中,worker 去队列取任务,执⾏后将结果返回给Temporal。

举一个银行的流程示例:

由四部分组成Start、Temporal Server、Worker、Bank

  • Start:工作流的创建者/发起者
  • Temporal Server:存储所有工作流的数据、状态的中间件,整个工作依赖于该 server(后续简写为TS)
  • Worker:实际进行逻辑处理的执行者
  • Bank:官方给的示例,可以理解为DB

具体的流程描述:

  • 启动 Temporal Server
  • 启动 Worker 监听TS,循环获取待执行的工作流
  • Start 创建一个工作流,封装参数,调用 sdk 的 api(rpc) 发送到 TS
  • Worker 拉取到工作流开始逻辑处理

2、Workflow

workflow 即表示工作流,在 Temporal 中,工作流是由函数或对象方法来实现(工作流样例见下文)。

一个 workflow 通常完成一个业务目标。同时,当多个 workflow 中,有同样的处理流程时,可以封装为一个子的workflow,来达到代码复用的目的。

2.1、工作流选项

启动Workflow的时候,可以设置这个Wrokflow的执行超时时间,以及失败后的重试次数、任务队列名等参数,来更好的满足业务需求

支持的配置参数如下:

workflowOptions := client.StartWorkflowOptions{

    ID:                       "hello_world_" + uuid.New(), //用于业务级别标识。不可能有两个一样的workflowId同时工作

    TaskQueue:                "hello-world",               //活动任务队列。让收到任务的 Worker 知道下一步要执行哪一段代码。 Workflows(工作流)只能使用一个任务队列

    WorkflowExecutionTimeout: 10 * time.Minute,            //Workflow的最大运行时间,包括失败后重试的时间。默认无限制

    WorkflowRunTimeout:       3 * time.Minute,             //单次运行的时间。默认值为 ExecuteTimeout

    WorkflowTaskTimeout:      10 * time.Second,            //从Worker从任务队列拉取到Workflow任务,到Worker开始执行Workflow的时间。如果超时,Server会认为Worker已经挂掉,会重新调度该Workflow给其他Worker,默认值10s

    RetryPolicy: &temporal.RetryPolicy{ //重试策略

        InitialInterval:        30 * time.Second,                         //初始间隔 描述:第一次重试前,需要等待多久。无默认值。如果提供重试策略,则必须提供一个值。用例:这用作退避系数乘以对抗的基本间隔时间

        BackoffCoefficient:     2,                                        //退避系数 描述:退避系数,表示多次重试时,下次等待的时间是上次的多少倍。默认值设置为 2.0。回退系数为 1.0 表示重试间隔始终等于初始间隔。用例:使用此来增加重试之间的时间间隔。通过具有回退系数,前几次重试相对较快地发生以克服间歇性故障,但随后的重检将发生越来越远的距离,以考虑更长的持久中断。使用 maximum interval 最大间隔选项来防止系数过多地增加重试间隔。

        MaximumInterval:        5 * time.Minute,                          //最大间隔 描述:下次重试时,最大等待时间。默认值:100*初始等待时间。用例:这对于大于 1.0 的系数很有用,因为它可防止间隔以指数级无限增长。

        MaximumAttempts:        1,                                        //最大重试次数 描述:默认值:0,表示无限重试,但在大多数情况下,建议依靠执行超时来限制检索的持续时间,而不是此选项。

        NonRetryableErrorTypes: []string{"TemporalTimeout:StartToClose"}, //表示Workflow遇到哪些Error后,不再进行重试

    },

}

2.2、Workflow Id

一个Workflow,可由 命名空间,Workflow Id 和 Run id 唯一标识

启动Workflow的时候,可以指定一个ID,这个ID一般采用业务级的ID,如一个要处理的客户的ID或订单ID

2.3、定时运行

启动Workflow的时候,可以设置为定时启动。

📢 注意。如果到了下次运行Workflow的时候,但上次的Workflow还没执行完(可能任务执行耗时长,或由于失败后重试等原因),会跳过下次运行Workflow

2.4、查询工作流状态

we = client.GetWorkflow(workflowID)

var result string

we.Get(ctx, &result) // 获取是阻塞的

3、 Activities

Activities可以理解为一个业务操作单元。在Workflow执行过程中,会将Activity放入消息队列,由其他Worker获取后,执行该Activity,并将结果再返回给Workflow。

3.1、Activity 选项

(1)超时配置
  1. ScheduleToStartTimeout:表示Activity任务放到消息队列,到Worker获取到的超时时间。如果超时后,也不会触发重试(不建议设置该值)
  2. StartToCloseTimeout:Activity实际执行超时时间。如果Activity执行时间不确定,最好按照最长时间设置。比如一个Activity可能需要2分钟、有时需要5分钟,那就设置为5分钟
  3. ScheduleToCloseTimeout:从Activity放入消息队列,到Activity执行完成的时间
  4. HeartbeatTimeout:Activity和Server的心跳超时时间。在Activity运行需要较长时间时需要。用于Server检查执行 Activity的Worker 是否已经挂掉
(2)重试策略

和Workflow的重试策略完全一致

(3)执行时间超长的Activity

如果一个Activity运行时间较长,最好设置一个心跳间隔超时。这样当执行Activity的Woker挂掉时,Server可以及时知道

3.2、工作流代码有变化时如何更改

三种方法可供使用

  • 基于任务队列的版本控制(建议)
    • 更改新工作流的任务队列名,让旧的 worker 继续运行,可减少实例的数量,知道全部执行
    • 优点:概念简单
    • 缺点:旧的 worker 长时间运行,且不能当前正在运行的 bug
  • 基于工作流名称的版本控制
  • Patch和GetVersion api
    •  根据 SKD 的 api workflow.GetVersion() 分支运行的新旧工作流代码

    • 优点:兼容性好
    • 缺点:长时间变更会引起使用上的歧义

4、Signal

对于正在运行的 WorkflowExecution,可以发送携带参数的信号,Workflow中可以等待或根据条件处理信号,动态控制工作流的执行逻辑。示例

5、Child Workflows

考虑工作流执行事件历史大小限制需要对父 Workflow 做拆分。希望将每个子工作流执行视为单独的服务。示例

6、Selectors

类似Go的select,允许goroutine等待多个通信。一个select块直到它的一个case可以运行,然后执行。如果多个已准备就绪,则随机选择一个。

Temporal 集群架构

  • 前端组件(Frontend Service)
    • 是一个单点网关,提供 Proto API。可以接受来自浏览器、tctl(Temporal的命令行工具)、以及业务方的调用请求。(主要用于接口限速、授权认证、校验和请求路由)

  • 记录服务(History service)
    • 用于记录Workflow的执行状态,并且支持横向拓展。

  • 匹配服务(Matching service)
    • 用于管理任务队列,及任务分发,并且支持横向拓展

  • 后台服务(Worker service)
    • 用于维护拷贝队列和执行一些Temporal服务自己的Wrokflow。

  • 数据库
    • 保存了用于分发的任务信息、以及Workflow的执行状态、命名空间元数据,前端可视化配置

工作流样例

  • Golang SDK文档: Temporal Go SDK developer's guide | Temporal Documentation
  • Golang 示例代码:GitHub - temporalio/samples-go: Temporal Go SDK samples
  • 与正常业务代码对比:Open Source Durable Execution Platform | Temporal Technologies

 常用 API 使用示例代码

Workflow执行状态、结果查看

Temporal 官网提供了Web UI组建。可以通过浏览器查看Workflow的执行状态和结果

1、看个简单的 hello world

1)worker 部分:主要是做工作流的注册,是执行 Activity、Workflow 逻辑的进程,并将执行结果返回给 Temporal Server

 点击此处展开...

2)starter 部分:发起工作流的进程

 点击此处展开...

2、执行结果查看

1)批量查看Workflow

进入Web UI首页,即可查看最新的工作流执行状态列表

2)查看单个Workflow详情

点击 Workflow ID,可以查看单个workflow的执行详情。

如下下图显示,可以看到Workerflow的:开始时间、结束时间、执行结果状态、输入参数、输出参数、...

3)查看单个Workflow的Activity的执行详情

Temporal 其他

工作流编排引擎选型

Temporal 部署

学习参考

  • 源码仓库:GitHub - temporalio/temporal: Temporal service
  • 官网文档:Documentation | Temporal Documentation
  • 创始人Maxim讲解的Temporal详细原理:https://www.youtube.com/watch?v=t524U9CixZ0&ab_channel=Temporal
  • Temporal分布式集群组件和原理:What is a Temporal Cluster? | Temporal Documentation
  • 7分钟快速入门案例:https://www.youtube.com/watch?v=2HjnQlnA5eY&ab_channel=Temporal
  • 3种使用场景详细介绍:https://www.youtube.com/watch?v=eMf1fk9RmhY&ab_channel=Temporal

其他资料

  • Open Source Durable Execution Platform | Temporal Technologies
  • What is Temporal? | Temporal Documentation
  • GitHub - temporalio/docker-compose: Temporal docker-compose files
  • GitHub - temporalio/temporal: Temporal service
  • GitHub - temporalio/helm-charts: Temporal Helm charts
  • GitHub - temporalio/samples-go: Temporal Go SDK samples
  • tctl v1.17 command reference | Temporal Documentation
  • GitHub - temporalio/docker-builds: Temporal service Docker images build
  • GitHub - uber/cadence: Cadence is a distributed, scalable, durable, and highly available orchestration engine to execute asynchronous long-running business logic in a scalable and resilient way.
  • Cadence
  • Temporal介绍_temporalio-CSDN博客
  • Build durable applications with Temporal | Temporal Documentation
  • Temporal Go SDK developer's guide | Temporal Documentation
  • Joey's Tech Notes & Blogs
  • What does "Long Running" really mean?
  • https://news.ycombinator.com/item?id=24216400
  • Temporal Go SDK developer's guide | Temporal Documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1307496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【概率方法】MCMC 之 Gibbs 采样

上一篇文章讲到,MCMC 中的 HM 算法,它可以解决拒绝采样效率低的问题,但是实际上,当维度高的时候 HM 算法还是在同时处理多个维度,以两个变量 x [ x , y ] \mathbf{x} [x,y] x[x,y] 来说,也就是同时从联合…

Nyquist Theorem(取样定理)

取样定理,又称为奈奎斯特定理(Nyquist Theorem),是信号处理领域中一项至关重要的基本原理。它规定了对于连续时间信号,为了能够完全准确地还原出原始信号,即使是在离散时间下进行采样和再构建,都…

算法基础之树的重心

树的重心 无向图: 边没有方向 有向图:边有方向 只能单向询问 无向图建立双向的边 要求输出每种情况连通块个数最大值的最小值**(最小的最大值)** #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace s…

2023-12-13 VsCode + CMake + Qt环境搭建

点击 <C 语言编程核心突破> 快速C语言入门 VsCode CMake Qt环境搭建 前言一、前期准备二、具体设置总结 前言 要解决问题: 最近研究 Qt, 使用 qtcreator, 发现在搭建 UI 界面时候很方便, 但到编码和调试就比较有问题了. 想到的思路: 用 VSCode 进行编码及调试. 其它…

003 FeedForward前馈层

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17torch 1.13.1cu117torchvision 0.14.1cu117 二、前馈层原理 Transformer模型中的前馈层&#xff08;Feed Forward Layer&#xff09;是其关键组件之一&#xff0c;对于模型的性能起着重要作用。下面将用900字对…

postman接口测试系列: 时间戳和加密

在使用postman进行接口测试的时候&#xff0c;对于有些接口字段需要时间戳加密&#xff0c;这个时候我们就遇到2个问题&#xff0c;其一是接口中的时间戳如何得到&#xff1f;其二就是对于现在常用的md5加密操作如何在postman中使用代码实现呢&#xff1f; 下面我们以一个具体的…

【EXCEL】数据透视实例

相关链接&#xff1a;Excel数据透视表全攻略 数据样例&#xff1a; 透视结果&#xff1a;

分析某款go端口扫描器之三

一、概述 前两篇主要分析些工具集&#xff0c;已经针对web服务的指纹和端口指纹信息进行识别&#xff0c;并没有真正开始扫描。本篇主要分析如何进行IP存活探测以及tcp扫描实现。 项目来源&#xff1a;https://github.com/XinRoom/go-portScan/blob/main/util/file.go 二、/…

云架构俭约之道七法则(The Frugal Architect)

文章目录 一、前言关于 Law 与 Rule 的区别 二、云架构俭约之道七法则Design&#xff08;设计方面&#xff09;Law 1&#xff1a;把成本作为非功能性需求Law 2&#xff1a;可持续性系统需要将成本与业务相匹配Law 3&#xff1a;架构设计是一系列权衡的取舍 Measure&#xff08;…

Unity | 渡鸦避难所-2 | 搭建场景并添加碰撞器

1 规范项目结构 上期中在导入一系列的商店资源包后&#xff0c;Assets 目录已经变的混乱不堪 开发过程中&#xff0c;随着资源不断更新&#xff0c;遵循一定的项目结构和设计规范是非常必要的。这可以增加项目的可读性、维护性、扩展性以及提高团队协作效率 这里先做下简单的…

vivado约束方法2

排序约束条件 因为XDC约束是按顺序应用的&#xff0c;并且是基于明确的优先级排列的规则&#xff0c;您必须仔细检查约束的顺序。 Vivado IDE为您的设计提供了全面的可视性。要逐步验证约束&#xff0c;请执行以下操作&#xff1a; 1.运行相应的报告命令。 2.查看Tcl控制台…

微信小程序自定义提示框组件并使用插槽 tooltip

创建tooltip组件引用 创建一个自定义组件&#xff0c;例如命名为 tooltip tooltip.wxml&#xff1a;用于定义组件的结构&#xff1b; <!--components/tooltip/tooltip.wxml--> <view class"tooltip-wrapper" hidden"{{hidden}}" style"lef…

spingboot项目实战之若依框架创建新模块

前言 目前的脚手架系统很多&#xff0c;比较早接触诺依框架&#xff0c;以若依框架为参考如何创建新模块 步骤 1. 下载诺依框架&#xff0c;依照参考说明一步步&#xff0c;能做到系统运行起来。 2. 准备好mysql文件&#xff0c;创建新数据库表 3. 数据库管理工具navicat…

如何退回chrome旧版ui界面?关闭Chrome浏览器新 UI 界面

之前启用新UI的方式 Chrome 已经很久没有进行过大的样式修改&#xff0c;但近期在稳定分支中添加了新的 flags 实验性标志&#xff0c;带来了全新的设计与外观&#xff0c;启用方式如下&#xff1a; 在 Chrome 浏览器的搜索栏中输入并访问 chrome://flags 搜索“refresh 2023…

Leetcode 46 全排列

题意理解&#xff1a; 首先明确全排列是什么&#xff1f; 使用集合里所有的元素&#xff0c;使用不同的顺序进行排列&#xff0c;所有的排列集合即为全排列。 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 这里的元素不会…

《YOLOv8改进系列》专栏目录介绍

YOLOv8改进系列 &#x1f680; 专栏目录介绍 本专栏内容是紧跟最新、最前沿的改进方法&#xff0c;不仅适用检测任务&#xff0c;分类任务&#xff0c;分割任务&#xff0c;关键点任务同样适用。文章适用于多种场景&#xff0c;包括但不限于小目标、工业缺陷、轻量化等领域。 …

猫粮哪个牌子质量好性价比高?口碑比较好的主食冻干猫粮牌子推荐

猫咪生骨肉主食冻干猫粮喂养方式是越来越火了&#xff0c;作为一个离职的十年经验宠物护理师&#xff0c;对宠物健康营养方面的知识一直在研究&#xff0c;不光是为了我自己养的猫咪身体健康&#xff0c;也要为客户的猫咪健康负责&#xff01;现在很多养猫人士对主食冻干猫粮喂…

AE (3)_主观亮度和对比度调试

#灵感# 画面的亮度、对比度是最直接&#xff0c;观看者最先获得的感受。所以有必要花时间认真调整。 ------哈哈&#xff0c;虽然调试的时间其实不如磨清晰度多。 目录 举个图例&#xff1a; 三个参数AE、gamma、LTM&#xff1a; 调试顺序&#xff1a; 举个图例&#xff1…

beebox靶场A2 low级别身份验证通关教程

1. 断开的身份验证 - 验证码绕过 Broken Auth. - CAPTCHA Bypassing 打开burp抓包在页面上输入账号为bee 密码随便输&#xff0c;输入验证码开始抓包拦截&#xff0c; 发到重放器进行重放&#xff0c;发现只是一直提示密码错误&#xff0c;那证明只要不刷新页面验证码应该就不…

2023年第三届产业数字化【金铲奖】重磅来袭!

做具备产业数字化价值的企业、案例标杆、资本机构的见证者、发现者、陪伴者。 出品|产业家 一年一度的金铲奖来了&#xff01; 在过去的一年时间里&#xff0c;我们清晰地看到&#xff0c;产业数字化的潮水更加汹涌澎湃且势不可挡&#xff0c;越来越多的企业开始寻求数字化…