03 Temporal 详细介绍

前言

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

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

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

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

工作流介绍

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

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

适用场景

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

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

常见工作流框架

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

  • 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,             //单次运行的时间。默认值为 ExecuteTimeoutWorkflowTaskTimeout:      10 * time.Second,            //从Worker从任务队列拉取到Workflow任务,到Worker开始执行Workflow的时间。如果超时,Server会认为Worker已经挂掉,会重新调度该Workflow给其他Worker,默认值10sRetryPolicy: &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 stringwe.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.mzph.cn/news/229160.shtml

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

相关文章

C语言学习第二十五天(顺序表)

顺序表 和数组的区别:首先顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口 分类: (1)静态顺序表 即使用定长数组存储元素 typedef int SLDataType; #define N 7 typedef struct SeqL…

RHCE 9版本考试资料

RHCE 9版本考试要求 01.安装和配置 Ansible 安装和配置 Ansible 按照下⽅所述,在控制节点 control上安装和配置 Ansible: 安装所需的软件包创建名为 /home/greg/ansible/inventory 的静态清单⽂件,以满⾜以下要求: node1 是 d…

2.6【渲染】混合渲染

一,混合渲染简介 当应用程序使用混合渲染选项时,应用程序必须确保渲染类型之间存在同步(例如,软件渲染、Khronos API渲染和blitting)。 以下示例演示了如何将软件渲染与Khronos渲染API混合使用。您需要按照以下步骤设置渲染目标和上下文: 创建渲染目标创建渲染上下文渲…

web项目理解

1.注解开发 这是一个 Java 自定义注解的定义,注解的名称是 AutoFill。以下是对代码的解释: java Target({ElementType.METHOD}) //注解在方法上面,指定注解的作用范围为方法 Retention(RetentionPolicy.RUNTIME) //指定注解的生命周期为运行…

【问题思考总结】只有load和store指令能够访存有什么好处?为什么能方便实现指令流水线?【CISC与RISC的区别】【2011 408真题T18 III】

问题 今天在搜寻这个问题的时候,发现鲜有人关注和回答,因此,在搜寻了一些外网的回答和资料后,通过思考,总结了一些个人的愚见,恳请各位指正。 思考 CISC与RISC的区别之我见 首先,这两种架构…

0级表空间后,又有0级全库备份,再1级表空间备份,xtts还认吗?

0级表空间后,又有0级全库备份,再1级表空间备份,xtts还认吗? 不认。此时需要根据提示报错的scn号再做备份再做恢复: backup incremental from SCN 1041682 tablespace DATA,USERS filesperset 300 format /bak/hisdb1…

C语言指针3

1.assert(条件); 一旦条件为假则报错 2.统一关闭assert方法: 在#include<assert.h> 上一行加上#define NDEBUG 3.但是引用assert会增加程序运行的时间 4.size_t等价于unsigned int 5.关于数组首元素的地址 两个特例: sizeof,&数组名 6. int main() {int a…

13.二进制枚举练习题

文章目录 二进制枚举练习题[78. 子集](https://leetcode.cn/problems/subsets/)[77. 组合](https://leetcode.cn/problems/combinations/)[1286. 字母组合迭代器](https://leetcode.cn/problems/iterator-for-combination/)[2397. 被列覆盖的最多行数](https://leetcode.cn/pro…

【算法Hot100系列】盛最多水的容器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ubuntu18使用docker编译和运行的步骤

在Ubuntu 18.04上使用Docker来编译和运行应用程序主要包括以下步骤&#xff1a; 安装Docker&#xff1a; 在Ubuntu上安装Docker之前&#xff0c;首先需要更新包索引并安装一些必要的包&#xff0c;以确保能够通过HTTPS使用仓库&#xff1a; sudo apt update sudo apt install a…

【设计模式-2.4】创建型——抽象工厂模式

说明&#xff1a;本文介绍设计模式中&#xff0c;创建型设计模式的抽象工厂设计模式&#xff1b; 工厂模式的问题 在【设计模式-2.2】创建型——简单工厂和工厂模式这篇博文中&#xff0c;介绍过飞机大战游戏里&#xff0c;使用简单工厂和工厂模式来创建坦克、飞机、Boss对象…

MySQL数据库,表的增量备份与恢复

1. 从物理与逻辑的角度 数据库备份可以分为物理备份和逻辑备份。物理备份是对数据库操作系统的物理文件&#xff08;如数据 文件&#xff0c;日志文件等&#xff09;的备份。这种类型的备份适用于在出现问题时需要快速恢复的大型重要数据库。 物理备份又可以分为冷备份&#xf…

【JAVA-Day65】Java内部类深度解析

Java内部类深度解析 《Java内部类深度解析》摘要引言一、理解内部类1. 内部类的基本概念和语法1.1 什么是内部类&#xff1f;1.2 内部类的语法结构1.3 内部类的基本概念 2. 不同类型的内部类详解2.1 成员内部类2.2 静态内部类2.3 局部内部类2.4 匿名内部类 二、内部类与普通类的…

t2017030921字母矩阵

题1 字母矩阵(char) 【问题描述】 小Y才学C不久就写了一个字母矩阵的题&#xff0c;即给出一个数字N&#xff0c;画出一个最外围全是字母‘A’的中空矩形&#xff0c;当N5时形如下图: AAAAA A A A A A A AAAAA 小Q看了这个图形后&#xff0c;想了想马上给出这样一个…

【Unity自动寻路】使用Navigation系统实现物体自动寻路绕开障碍物

知识点流程图 自动导航Navigation系统 我们在游戏场景中经常会有一些障碍物、墙壁、树木等等&#xff0c;如果我想要让角色或者怪物去墙的另一边&#xff0c;我直接在墙另一边点击左键&#xff0c;我希望角色自动跑过去&#xff0c;但是他不能直接穿透墙&#xff0c;他需要“智…

04-Nacos中负载均衡规则的配置

负载均衡规则 同集群优先 默认的ZoneAvoidanceRule实现并不能根据同集群优先的规则来实现负载均衡,Nacos中提供了一个实现叫NacosRule可以优先从同集群中挑选服务实例 当服务消费者在本地集群找不到服务提供者时也会去其他集群中寻找,但此时会在服务消费者的控制台报警告 第…

六大设计原则

六大设计原则 1、单一职责原则 一个类或者模块只负责完成一个职责或者功能。 2、开放封闭原则 规定软件中的对象、类、模块和函数对扩展应该是开放的&#xff0c;对于修改应该是封闭的。用抽象定义结构&#xff0c;用具体实现扩展细节。 3、里氏替换原则 如果S是T的子类型…

STM32_串口下载程序

目录标题 前言1、理论知识2、串口下载具体操作2.1、硬件准备2.2、软件准备2.3、设置单片机的启动模式为系统存储器启动2.4、软件配置2.5、下载程序 附:生成hex文件 前言 使用调试器下载程序又快有稳定还能使用调试功能&#xff0c;当然是下载调试的首选。但是拓展下串口下载程…

BAQ压缩原理

什么是BAQ? BAQ——Block Adaptive Quantization,块自适应量化 BAQ是一种数据压缩算法。 谁提出了BAQ压缩? BAQ压缩原理是由美国NASA JPL的R. Kwok和W.T.K. Johnson在1989年提出的。第一次被用于美国NASA的“麦哲伦金星探测”任务中。 BAQ压缩的目的是什么? 上世纪后半…

Springboot Minio最新版大文件下载

上节我们说了Minio怎么大文件上传&#xff0c;我们是进行了分段上传&#xff0c;然后合并处理&#xff0c;感兴趣的可以去这篇文章&#xff0c; Springboot Minio最新版大文件上传-CSDN博客 那么今天的主题就是大文件下载&#xff0c;再大文件就需要分段下载&#xff0c;也就需…