开源golang兼容crontab的定时任务管理器

栏目: IT技术 · 发布时间: 5年前

内容简介:前言:业务越来越复杂,有太多太多的定时任务需要管理,如事务检查,风控扫描,报表,日报等等。这些任务本身都是golang写的,所以需要一个基于golang开发的定时管理器。如果只是需要定时器管理,我们可以直接用timer或者ticker,甚至自己用minHeap来实现。但传统的时间格式表现力一般,比如我需要每个周一和周三的上午来报表输出?所以需要crontab格式的支持。

前言:

业务越来越复杂,有太多太多的定时任务需要管理,如事务检查,风控扫描,报表,日报等等。这些任务本身都是golang写的,所以需要一个基于golang开发的定时管理器。 

如果只是需要定时器管理,我们可以直接用timer或者ticker,甚至自己用minHeap来实现。但传统的时间格式表现力一般,比如我需要每个周一和周三的上午来报表输出?所以需要crontab格式的支持。

该文章后续仍在不断的更新修改中, 请移步到原文地址   http://xiaorui.cc/?p=5625

在github里,比较火热的golang crontab库是 robfig/cron,花了些时间看了他的代码,crontab解析器写的没有问题,单元测试也很丰富,但是任务的调度有些粗糙,比如没有修改和停止定时任务。

我需要的定时任务管理是可以动态的对任务进行增删改查,这样才可以跟基于 mysql 数据库开发的配置系统结合在一起,方便的组织管理任务。robfig/cron 暂时还不能做这些功能。 所以,为了应对我的需求,我自己在robfig/cron库的基础上做了一些封装,俗称造轮子。 项目名很简单,叫cronlib 。

代码已经push到github了, 地址   https://github.com/rfyiamcool/cronlib   ,求 star !!!

golang cronlib有什么优点?

1. 线程安全

robfig/cron不是线程安全的,管理任务的slice存在并发安全的问题。cronlib是加锁的。

2.  修改任务的结构

不仅可以修改任务的时间,还可以修改回调方法等。

3.  停止任务

4.  增加异步和同步模式

一个任务的执行周期是1分钟调用一次,但是调用的方法发生block,耗时超过一分钟。如果异步模式,可能系统内存在两个协程在跑一个任务。当然,选择同步或异步,还需要业务上的考虑。

5.  增加join方法

优雅退出,只有在所有任务都退出后,才会return

go cronlib的使用例子

// xiaorui.cc
 
package main
 
// test for crontab spec
 
import (
	"log"
	"time"
 
	"github.com/rfyiamcool/cronlib"
)
 
func main() {
	cron := cronlib.New()
 
	specList := map[string]string{
		"risk.scan.total.1s":       "*/1 * * * * *",
		"risk.scan.total.2s":       "*/2 * * * * *",
		"risk.scan.total.3s":       "*/3 * * * * *",
		"risk.scan.total.4s":       "*/4 * * * * *",
		"risk.scan.total.5s.to.3s": "*/5 * * * * *",
	}
 
	for srv, spec := range specList {
		tspec := spec // copy
		ssrv := srv   // copy
		job, err := cronlib.NewJobModel(
			spec,
			func() {
				stdout(ssrv, tspec)
			},
		)
		if err != nil {
			panic(err.Error())
		}
 
		err = cron.Register(srv, job)
		if err != nil {
			panic(err.Error())
		}
	}
 
	// update test
	time.AfterFunc(10*time.Second, func() {
		spec := "*/3 * * * * *"
		srv := "risk.scan.total.5s.to.3s"
		log.Println("reset 5s to 3s", srv)
		job, _ := cronlib.NewJobModel(
			spec,
			func() {
				stdout(srv, spec)
			},
		)
		cron.UpdateJobModel(srv, job)
		log.Println("reset finish", srv)
 
	})
 
	// kill test
	time.AfterFunc(3*time.Second, func() {
 
		srv := "risk.scan.total.1s"
		log.Println("stoping", srv)
		cron.StopService(srv)
		log.Println("stop finish", srv)
 
	})
 
	time.AfterFunc(11*time.Second, func() {
 
		srvPrefix := "risk"
		log.Println("stoping srv prefix", srvPrefix)
		cron.StopServicePrefix(srvPrefix)
 
	})
 
	cron.Start()
	cron.Wait()
}
 
func stdout(srv, spec string) {
	log.Println(srv, spec)
}

需要说明的是cronlib库里crontab格式是支持秒的,一共6列,第一列是秒。linux系统的crontab只能支持到分钟,一共五列。 更多的go crontab的格式,大家可以参考下 https://github.com/robfig/cron 的godoc 。

另外我在cronlib的repo里放了一些例子,大家可以看看。 https://github.com/rfyiamcool/cronlib/tree/master/example

总结:

原本想不基于 robfig/cron直接开发定时任务管理器,后来发现crontab格式解析太过繁琐,再加上一套完整的单元测试,太耗时间了,所以还是基于robfig/cron搞了。

现在只是把go cronlib库开源了,这个属于单机版了。如果后期在多节点场景下,还是需要有分布式控制及数据库的配置管理等。我会近期整理出一个版本,开源出去。

end.

大家觉得文章对你有些作用! 如果想 赏钱 ,可以用微信扫描下面的二维码,感谢!

另外再次标注博客原地址   xiaorui.cc

开源golang兼容crontab的定时任务管理器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从需求到产品:0岁产品经理进阶之道

从需求到产品:0岁产品经理进阶之道

权莉 / 人民邮电出版社 / 2018-7 / 49.80元

本书主要针对刚入职的初级产品经理,从贴近工作状态的场景切入,对各阶段的知识点进行分类总结,旨在提供一套经过实践检验的产品方法论,为读者从初级产品经理成长为产品经理奠定坚实的基础。 书中提炼的方法和案例涵盖初级产品经理工作的方方面面,从基本技能到思维方式,从需求管理到产品规划定义,从框架选型到流程梳理,从工作模块拆解到案例剖析,用具体且贴合实际工作场景的内容,还原真实的产品工作方法及实践案例,既有方......一起来看看 《从需求到产品:0岁产品经理进阶之道》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具