文章目录
前言
公司前员工优化了内部的视频转码流程,引入了工作流,使用的是Temporal框架,其离职后没人了解该项目。本人出于学习的态度便学习Temporal框架,并希望后续能独立接手该项目,积累实战经验,所以深入学习了Temporal。
我们的视频工作流只要包括:去水印、视频下载、多码率转码等。
一、Temporal是什么?
官方说明:Temporal是一种分布式、可扩展、持久且高度可用的编排引擎,用于以可扩展和弹性的方式执行一步长时间运行的业务逻辑。Temporal Go SDK是使用Go语言创作工作流和活动的框架。
从官方说明SDK里可以看到2个关键词 “工作流” 和 “活动”,这两个是主体。
二、组件有哪些?
官方给的组件示意图如下,由四部分组成Start、Temporal Server、Worker、Bank。
- Start:工作流的创建者/发起者
- Temporal Server:存储所有工作流的数据、状态的中间件,整个工作依赖于该server(后续简写为TS)
- Worker:实际进行逻辑处理的执行者
- Bank:官方给的示例,可以理解为DB
具体的流程描述:启动Temporal Server。启动Worder监听TS,循环获取待执行的工作流。Start创建一个工作流,封装参数,调用sdk的api(rpc)发送到TS。Worker拉取到工作流开始逻辑处理。
woker是Activity和Workflow的包装,worker的唯一工作就是执行Activity和Workflow并将结果返回给TS。
一个Wokeflow包含多个Activity,对Activity进行编排,多个Activity可以并行,也可以同步(阻塞到都某个Activity执行完毕)。其底层会阻塞到Future.Get()方法上。
三、TS启动
在本地下载并启动TS。
$ git clone https://github.com/temporalio/docker-compose.git
$ cd docker-compose
$ docker-compose up
使用temporal的命令行工具与本地TS交互。
$ alias tctl="docker exec temporal-admin-tools tctl"
$ tctl namespace list
$ tctl workflow list
启动后,网页里输入 http://localhost:8088,检查TS是否正常运行。
四、样例代码
1.目录结构
2.代码
2.1 start
package main
import (
"context"
"go.temporal.io/sdk/client"
"log"
"temporal/workflow"
)
type Student struct {
Id int64
Name string
}
func main() {
c, err := client.NewClient(client.Options{
})
if err != nil {
log.Fatalln("unable to create Temporal client", err)
}