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)超时配置
- ScheduleToStartTimeout:表示Activity任务放到消息队列,到Worker获取到的超时时间。如果超时后,也不会触发重试(不建议设置该值)
- StartToCloseTimeout:Activity实际执行超时时间。如果Activity执行时间不确定,最好按照最长时间设置。比如一个Activity可能需要2分钟、有时需要5分钟,那就设置为5分钟
- ScheduleToCloseTimeout:从Activity放入消息队列,到Activity执行完成的时间
- 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
相关文章:
03 Temporal 详细介绍
前言 在后端开发中,大家是否有遇到如下类型的开发场景 需要处理较多的异步事件需要的外部服务可靠性较低需要记录保存某个对象的复杂状态 在以往的开发过程中,可能更多的直接使用数据库、定时任务、消息队列等作为基础,来解决上面的问题。然…...
【算法】【动规】乘积为正数的最长子数组长度
跳转汇总链接 👉🔗算法题汇总链接 1.1 乘积为正数的最长子数组长度 🔗题目链接 给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积…...
Kubernetes实战(十四)-k8s高可用集群扩容master节点
1 单master集群和多master节点集群方案 1.1 单Master集群 k8s 集群是由一组运行 k8s 的节点组成的,节点可以是物理机、虚拟机或者云服务器。k8s 集群中的节点分为两种角色:master 和 node。 master 节点:master 节点负责控制和管理整个集群…...
Spring之容器:IOC(1)
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…...
【.Net 6.0--通用帮助类--ConvertHelper】
前言 类型转换帮助类,包含下表中的方法: 方法名方法解释ObjToIntobject转intObjToMoneyobject转doubleObjToStringobject转stringObjToDecimalobject转decimalObjToDateobject转datetimeObjToDateSplitYMDobject转datetime(yyyy-MM-dd&…...
【加解密】报文签名与加解密,MD5,RSA,AES使用案例(基于 Java)
需要考虑哪些问题? 在进行报文传输时,有两个问题需要考虑: 消息防篡改加密报文 定义消息结构 为了方便后面使用,这里定义消息结构: public static class Message {public String data; //消息public String sign;…...
新建vue3项目
三种方法 一. 第一种方式 1、操作步骤: 创建项目目录 vue create 项目名称选择配置方式 ? Please pick a preset: #选择一个配置 Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint)Manually select …...
出现 Error:Unable to access jarfile xxxx\target\nacos-server.jar 解决方法
目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行Nacos中的startup.cmd的时候出现闪退,于是在该脚本的最后一行添加pause,查看因为什么原因闪退 出现的bug如下所示:Error:Unable to access jarfile xxxx\target\nacos-server.jar 截图如下所示: 查看内部文件夹,…...
记录一次API报文替换点滴
1. 需求 各位盆友在日常开发中,有没有遇到上游接口突然不合作了,临时需要切换其他接口的情况?这不巧了,博主团队近期遇到了,又尴尬又忐忑。 尴尬的是临时通知不合作了,事前没有任何提醒; 忐忑…...
PMP项目管理 - 沟通管理
系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…...
fckeditor编辑器改造示例:增加PRE,CODE控件
查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 修改方法:1)修改fckco…...
风速预测(五)基于Pytorch的EMD-CNN-LSTM模型
目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集,按照8:2划分训练集和测试集 2.2 设置滑动窗口大小为96,制作数据集 3 基于Pytorch的EMD-CNN-LSTM模型预测 3.1 数据加载&…...
单元测试二(理论)-云计算2023.12-云南农业大学
文章目录 一、单选题1、三次握手、四次挥手发生在网络模型的哪一层上?2、互联网Internet的拓扑结构是什么?3、以下哪一种网络设备是工作在网络层的?4、以下哪种关于分组交换网络的说法是错误的?5、以下哪种协议是在TCP/IP模型中的…...
QModelIndex 是 Qt 框架中的一个类,用于表示数据模型中的索引位置
QModelIndex 是 Qt 框架中的一个类,用于表示数据模型中的索引位置。 在 Qt 中,数据模型是一种组织和管理数据的方式,常见的数据模型包括 QAbstractItemModel、QStandardItemModel 和 QSqlQueryModel 等。QModelIndex 类提供了一种标识数据模…...
前端实现一个时间区间内,再次单选功能,使用Antd组件库内日历组件Calendar
需求:需要先让用户选择一个时间区间,然后再这个时间区间中,让用户再次去单选其种特殊日期。 思路: 1.先用Antd组件库中日期选择DatePicker.RangePicker实现让用户选择时间区间 2.在选择完时间区间后,用这个时间区间…...
【运维笔记】Hyperf正常情况下Xdebug报错死循环解决办法
问题描述 在使用hyperf进行数据库迁移时,迁移报错: 查看报错信息,错误描述是Xdebug检测到死循环,可是打印的堆栈确实正常堆栈,没看到死循环。 寻求解决 gpt 说的跟没说一样。。 google一下 直接把报错信息粘贴上去…...
嵌入式开发中的总线与时钟
总线 AHB总线 AHB的全称是"Advanced High-performance Bus",中文翻译就是"高级高性能总线"。这是一种在计算机系统中用于连接不同硬件组件的总线架构,它可以帮助这些组件之间高效地传输数据和信息。这个总线架构通常用于处理速度较快且对性能要求较高的…...
k8s debug 浅谈
一 k8s debug 浅谈 说明: 本文只是基于对kubectl debug浅显认识总结的知识点,后续实际使用再补充案例 Kubernetes 官方出品调试工具上手指南(无需安装,开箱即用) debug-application 简化 Pod 故障诊断: kubectl-debug 介绍 1.18 版本之前需要自己…...
Day10 Liunx高级系统设计11-数据库2
DQL:数据查询语言 查询全表 select * from 表名; 查询指定列 select 列名 1, 列名 2,… from 表名 ; 条件查询 select * from 表名 where 条件 ; 注意: 条件查询就是在查询时给出 WHERE 子句,在 WHERE 子句中可以使用如下运算符及关键 字&#…...
车载导航系统UI界面,可视化大屏设计(PS源文件)
大屏组件可以让UI设计师的工作更加便捷,使其更高效快速的完成设计任务。现分享车载导航系统科技风蓝黑简约UI界面、车载系统UI主界面、车载系统科技风UI界面、首页车载系统科技感界面界面的大屏Photoshop源文件,开箱即用! 若需 更多行业 相关…...
工作之踩坑记录
1.i386架构之atol函数使用导致的业务程序错误: 情景:将框架传递的链接地址采用整形保存传输,在i386架构上导致地址比较大,采用atol转型可能导致数据被截断出现异常。 方案:采用atoll更大的数据类型进行处理即可避免该问题。 2.Json库使用注意long int问…...
【深度学习目标检测】四、基于深度学习的抽烟识别(python,yolov8)
YOLOv8是一种物体检测算法,是YOLO系列算法的最新版本。 YOLO(You Only Look Once)是一种实时物体检测算法,其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化,提高了检测速度和准确性。…...
YML学习
讲解YML使用场景、语法和解析 1.基础知识1.1 什么是YML1.2 YML优点1.3 YML使用场景 2.YML语法2.1 基础语法2.2 字面量数据类型2.2.1 字符串2.2.2 NULL2.4.5 时间戳(timestamp) 2.3 对象\MAP类型2.4 数组/List/Set2.4.1 值为基础类型2.4.2 值为对象2.4.3 …...
华为HCIP认证H12-821题库下
26、6.交换技术核心知识 (单选题)某交换机运行RSTP协议,其相关配置信息如图所示,请根据命令配置情况指出对于Instance 1,该交换机的角色是: A、根交换机 B、非根交换机 C、交换机 D、无法判断 正确答案是&…...
01--二分查找
一. 初识算法 1.1 什么是算法? 在数学和计算机科学领域,算法是一系列有限的严谨指令,通常用于解决一类特定问题或执行计算 不正式的说,算法就是任何定义优良的计算过程:接收一些值作为输入,在有限的时间…...
初识大数据应用,一文掌握大数据知识文集(1)
文章目录 🏆初识大数据应用知识🔎一、初识大数据应用知识(1)🍁 01、请用Java实现非递归二分查询?🍁 02、是客户端还是Namenode决定输入的分片?🍁 03、mapred.job.tracker命令的作用?…...
Kafka生产问题总结及性能优化实践
1、消息丢失情况 消息发送端: (1)acks0: 表示producer不需要等待任何broker确认收到消息的回复,就可以继续发送下一条消息。性能最高,但是最容易丢消息。大数据统计报表场景,对性能要求很高&am…...
[MySQL]数据库原理2,Server,DataBase,Connection,latin1、UTF-8,gb2312,Encoding,Default Collation——喵喵期末不挂科
希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…...
【算法集训】基础数据结构:十、矩阵
矩阵其实就是二维数组,这些题目在9日集训中已经做过,这里做的方法大致相同。 第一题 1351. 统计有序矩阵中的负数 int countNegatives(int** grid, int gridSize, int* gridColSize) {int r gridSize;int c gridColSize[0];int ret 0;for(int i 0;…...
python排序算法 直接插入排序法和折半插入排序法
最近需要使用到一些排序算法,今天主要使针对直接插入排序和折半插入排序进行讲解。 首先是直接插入排序,其排序过程主要是,针对A[a1,a2,a3,a4,a5....an],从排序的序列头部起始位置开始,将其也就是a1视为只有一个元素的…...
网站建设多少钱鞋/最强大的搜索引擎
下面要给大家分享的就是java简单工厂模式例子,一起来了解一下java实现一个工厂模式应该如何操作吧。简单工厂模式:下面以农夫山泉工厂为例子,农夫山泉生产矿泉水以及茶π等饮料,这里的话矿泉水以及茶π都属于饮料,都有…...
wordpress网易云音乐自定义css/在百度怎么创建自己的网站
序言最近准备搞搞硬件,略懂电子元器件、Python,主业PHP,准备写树莓派系列文章(从入门到放弃的那种),希望各位捧个人场。准备工作有动手能力的可以使用树莓派4B裸板,可以在某东和某宝买,也可购买套装带传感器…...
17网站一起做网店靠谱吗/网站优化价格
ps:查看当前进程(ps -aef)例子:查看当前进程用户ID 进程ID 父进程ID CPU占用率 开始时间 终端ID 运行总时间 命令名pidof:查看某项服务的所有进程Kill:中止进程例子:中止进程ID为3393的进程killall:…...
做营销最好的网站源码/百度安装到桌面
在安装好Maven之后,默认的~/.m2目录下是没有maven仓库配置文件settings.xml的,默认使用的是官方的仓库,访问速度会非常慢,我们需要配置下国内的仓库。 创建~/.m2/settings.xml文件,文件内容如下: <?xm…...
桂林创新大厦网站/网络推广的网站有哪些
受工作性质所影响 最近对DataBase蛮有兴趣 之前只是对SQL Server小有接触 一直只能仰望Oracle和DB2 最近突然想对他们动起了念头 因为网速原因 DB2暂时还未下载到 所以就只好先对Oracle 10g下手了 安装过程倒是挺顺利 对于第一次接触Oracle的我来说 安装成功后 真是点不知所措 …...
网站建设关键词/seo网站管理招聘
rt转载于:https://www.cnblogs.com/speedoops/archive/2010/12/14/1906155.html...