分布式任务调度框架基本能力:

  1. 任务管理能力(增删改查、执行、定时执行、延时执行、健康监控)
  2. 集群管理能力(扩展简单、效率高)
  3. 编程能力(运行代码)
  4. Web界面管理

目前市面上有很多可用于处理分布式任务的开源框架,比如Elastic-JobXXL-JobQuartz等等,它们或多或少都能满足以上列出的各项基本能力,然而,它们都是以Java系语言编写的,这不禁让人产生疑问,难道Go就没有自己的开源任务调度框架吗?

经过在网络上一番翻箱倒柜,找到了类似gocrongocraft/workrobfig/cron等一系列工具。然而它们或者年久失修;或者不足以称之为框架(顶多是个三方库);或者没有界面;等等问题不一而足。但是终于,还是发现了这款堪称满足对分布式调度框架所有幻想的开源项目: Temporal 。目前Star数还不是很多,但是不妨碍它成为一款golang编写的最佳分布式任务调度框架的潜质。不多废话,赶紧来介绍给大家看看。

在Temporal的眼中,对自己的定位是 microservice orchestration platform,提供工作流编排、C\S架构、状态查询等一系列功能。在我看来,它基本覆盖了以上列出的四点能力,我们以一个架构图开始它的介绍:

我们从左往右看,依次出现的几个角色是ActivityWorkflowWorkersTemporal ServerCLIWebSDK。我们列一张表对它们进行简单介绍:

角色 说明
Activity 一段可运行代码(function),可以包含任何逻辑。由于Temporal提供了各种语言的SDK(go、java、python、php等等)所以Activity是不限制语言的。
Workflow Activity的集合,多个Activity可以构成一个Workflow,也是调度的最小单位。
Workers 不同语言写的Workflow可以注册到对应语言的Worker中,Worker是代码的真正执行者
Temporal 管理注册到自己的Workers,向Workers下发任务,监听任务状态等等
CLI or SDK 任务的发起者、监控任务进度等
Web 负责任务的监控、查询等。

这个架构是不是有点类似生产者-消费者模型,CLI or SDK是生产者,负责启动某个Workflow;Temporal类似 kafka\RocktMQ ,负责把请求调度某个Worker;Workers是消费者,负责执行请求。但深入思考一下,我还是觉得跟消息队列有很大差别:

    1. 更关注任务的执行消息队列的核心是消息,生产者不关心这个消息被谁消费,消息队列关注的是消息是否送达。而 Temporal ,关注的是任务,关注任务执行进度和结果,是否需要重启等等。2. 需要提前设计好Workflow消息队列不需要关注消费者怎么消费消息的。而 Temporal ,你必须先把Workflow的逻辑写好。

所以这两个系统还是不太一样的,选择 Temporal,是因为我们想执行某个预定任务,并保证它执行成功。比如,交易系统每晚定时对账;注册系统过段时间自动向用户发送短信等。虽然用MQ也能实现,但可能要做很多错误处理等工作。

Temporal 示例

Talk is cheap, show me the code.

接下来用一个简单的示例展示下 Temporal的使用流程,场景是延时1小时向用户发送短信和邮件。

1. 先编写Activity的代码:
type MessageRequest struct {PhoneNum stringContent  stringTags     []string
}func SendMessage(ctx context.Context, mr MessageRequest) (mresp MessageResponse, error) {fmt.Printf("\nSending message to %s \n Content is %s \n ",mr.PhoneNum,mr.Content,)return nil, nil
}type EmailRequest struct{From string To string Content stirng
}func SendEmail(ctx context.Context, er EmailRequest) error{fmt.Printf("\nSending email to %s \n Content is %s \n ",er.To,er.Content,)return nil, nil
}

Activity的代码的限制其实是很少的,实际上,对函数签名没有什么限制,什么样的函数都可以成为Activity,甚至结构体上的方法也可以。

2. Workflow 的代码
func SendMessageWorkflow(ctx workflow.Context, msq MessageRequest, er EmailRequest) error {options := workflow.ActivityOptions{StartToCloseTimeout: time.Minute,}ctx = workflow.WithActivityOptions(ctx, options)// 设计工作流// 1. 先执行SendMessage 活动err := workflow.ExecuteActivity(ctx, SendMessage, msq).Get(ctx, nil)if err != nil {return err}// 2. 再执行 SendEmail 活动err = workflow.ExecuteActivity(ctx, SendEmail, msq).Get(ctx, nil)if err != nil {return err}return nil
}

其实 Workflow 也是一段函数,我们可以在这段函数里写逻辑,那为什么还要Activity呢?我直接把所有逻辑写到Workflow里不就好了。
这样设计主要是Workflow里的代码有些限制,比如不能和外部系统交互(读写文件、访问网络)等,而Activity就没有这种限制。

3. 启动 Workers
func main() {// 连接到 Temporal Server,注册自己c, err := client.NewClient(client.Options{})if err != nil {log.Fatalln("unable to create Temporal client", err)}defer c.Close()w := worker.New(c, app.TaskQueue, worker.Options{})w.RegisterWorkflow(app.SendMessageWorkflow)w.RegisterActivity(app.SendMessage)w.RegisterActivity(app.SendEmail)// Start listening to the Task Queueerr = w.Run(worker.InterruptCh())if err != nil {log.Fatalln("unable to start Worker", err)}
}

最后,我们启动一个Worker,把它注册到TemporalServer,再把WorkflowActivity注册到它内部。这个Worker就启动成功了。
如果结合K8s,我们还能编排不同的Worker,比如:给Worker扩缩容,监控Worker等。

4. 启动 TemplateServer

按照官网的文档启动即可。

5. 发起任务
func main() {// 先连上 TemplateServerc, err := client.NewClient(client.Options{})if err != nil {log.Fatalln("unable to create Temporal client", err)}defer c.Close()options := client.StartWorkflowOptions{TaskQueue: app.TaskQueue,}r1 := app.MessageRequest{...}r2 := app.EmailRequest{...}we, err := c.ExecuteWorkflow(context.Background(), options, "SendMessageWorkflow", transferDetails)if err != nil {log.Fatalln("error starting SendMessageWorkflow", err)}printResults(we.GetID(), we.GetRunID())
}

最后,我们使用SDK提供的方法启动WorkflowTaskQueue用于路由到Worker,再提供Workflow的函数名,就可以调用成功了。

Temporal 总结

至此,非官方的简单介绍就完毕了,Temporal的官网:https://docs.temporal.io/ 有更详细的介绍、示例代码等,比我这里的更加详细,可以跳转过去查看。

如果有小伙伴发现 Go 语言中有更好更强大的任务调度框架,也可以在评论区交流,也许还有很好的开源项目,等待被发掘出来~

分布式任务调度框架(Temporal)介绍相关推荐

  1. XXL-Job分布式任务调度框架-- 介绍和调度中心的搭建启动1

    一 xxl-job介绍 1.1 xxl-job介绍 xxl-job是轻量级的分布式任务调度框架,目标是开发迅速.简单.清理.易扩展; 老版本是依赖quartz的定时任务触发,在v2.1.0版本开始 移 ...

  2. 分布式任务调度框架和微服务的区别

    一.前言 分布式大行其下的时代,让大家彻底的抛弃了传统陈旧的技术框架.几乎每一个技术人都知道和掌握了微服务架构,微服务自然有它的美,但是所以技术框架都必须服务于业务,结合自身业务选取甚至自研适合自身的 ...

  3. 分布式任务调度框架Power-Job

    分布式任务调度框架的由来及对比 在大型业务业务系统中,不可避免会出现一些需要定时执行需求的场景,例如定时同步数据,定时清洗数据,定时生成报表,大量机器一同执行某个任务,甚至有些需要分布式处理的任务例如 ...

  4. 【niubi-job——一个开源的分布式任务调度框架】-----安装教程

    niubi-job是什么 niubi-job是LZ耗时三个星期,费尽心血打造的一个具备高可靠性以及水平扩展能力的分布式任务调度框架,采用quartz作为底层的任务调度管理器,zookeeper做集群的 ...

  5. 自己动手实现分布式任务调度框架

    前段时间,公司要改造现有的单节点调度为分布式任务调度,然后就研究了目前市面上主流的开源分布式任务调度框架,用起来就一个感觉:麻烦!特别是之前在一个类里写了好多个调度任务,改造起来更加麻烦.我这人又比较 ...

  6. 分布式事务框架seata介绍

    分布式事务框架seata介绍 一 . 事务特性(ACID) 1.原子性(A) 在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态.对于事务在执行中发生错误,所有的操作都会被回滚,整个事务 ...

  7. LTS 轻量级分布式任务调度框架(Light Task Schedule) - 推酷

    LTS 轻量级分布式任务调度框架(Light Task Schedule) - 推酷

  8. LTS 轻量级分布式任务调度框架(Light Task Scheduler)

    框架概况: LTS是一个轻量级分布式任务调度框架.有三种角色, JobClient, JobTracker, TaskTracker.各个节点都是无状态的,可以部署多个,来实现负载均衡,实现更大的负载 ...

  9. 分布式任务调度框架XXL-JOB --配置部署

    配置部署"调度中心" 调度中心项目:xxl-job-admin 作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台. 步骤一:调度中心配置: 调度中心配置 ...

最新文章

  1. 看!清华网红自行车成精了:拥有“类人脑芯片”,可无人驾驶!
  2. python使用spark_apache spark - 在python中导入pyspark
  3. webbrowser填充textarea的问题
  4. c语言怎么输出线性表里元素,C语言的世界-线性表
  5. SH1B LMR62014XMFE/NOPB
  6. css旋转45度_css 渐变过渡2D
  7. python结束多线程_如何中断/停止/结束挂起的多线程python程序
  8. CCNP学习笔记第一周
  9. 全国分省企业CEO任期、CEO学历数据(5W+)
  10. 手机的小窗口怎么弄_vivo怎么弄小窗口 vivo怎样弄小窗口
  11. 3d建模师是吃青春饭的吗?混子上限也就8K,资历能力都很重要
  12. 高手速成android开源项目【View篇】
  13. 接入广告App 教你如何赚取你的第一桶金 - 2048(含源码)
  14. sql怎么与oracle连接,sql怎么连接oracle数据库
  15. 【图解】本地IIS局域网内无法访问的问题
  16. 阿里云Redis开发遇到的问题总结
  17. 【升级为阿里云云效Codeup】
  18. 【项目总结】医疗化验单的OCR识别
  19. java适配器模式例子_java适配器模式实例解析
  20. excel批量添加超链接

热门文章

  1. 外贸sns营销方法有哪些步骤?
  2. 音视频编解码知识学习详解(分多部分进行详细分析)
  3. 2020低压电工模拟考试题及低压电工模拟考试题库
  4. html语言语法骨架格式,0002 认识HTML(骨架、DOCTYPE、lang、charset)
  5. 三点弯曲的有限元仿真
  6. 【腾讯云原生降本增效大讲堂】京东云原生大规模实践之路
  7. 2022-7-15 廉价国产PLC工控板带485主从通信的零散记录
  8. c语言switch可以嵌套嘛,判断嵌套 switch 语句 - C语言教程
  9. 2.基于原型的聚类方法
  10. 【已经解决】Illegal access: this web application instance has been stopped already