推荐一款开源的分布式任务调度系统

推荐一款开源的分布式任务调度系统

这个开源项目是由美团的一位大佬开发的,由名字的缩写取名而成xxl-job

它主要用于调度任务,简单来说就是完成项目中一些重复执行的特定业务。就像闹钟一样,设定每天6:00叫醒你。只要有电,他都风雨无阻每天6点响起铃声

类似的项目还有当当网开发的elastic-job,同样也是分布式的。

系统对稳定性要求不高,可以使用更为轻量的一款开源框架Spring-task

一、介绍下这个系统

简单说下xxl-job 它集成简单,对业务侵占性低,动态执行任务等优点

架构设计上它将整个系统分为两个部分来设计。1、调度中心 2、执行器

最早发现这个框架时,正赶上公司在做微服务的项目。当时执行器作为微服务中一个独立的服务模块来运行,

不侵占其他业务服务模块的特点是选择它的一个原因。

以上说了一些优点,当然优点还有很多,在官网可以查到。可以根据描述的特性来衡量是否符合自己公司的业务。

二、遇到的问题

下面说下近期因为项目做了大的变动而引出的一个问题,

公司项目由云上转为内网。数据库做了升级和一些安全策略的变动,

禁用了mysql的 select last_insert_id() 。这个函数是为了 得到刚 insert 进去的记录主键值,适用于自增主键

Xxl-job的表字段主键定义为int(11) NOT NULL AUTO_INCREMENT

这么设计的目的应该是为了数据操作时速度达到最优。

但如果数据量过大或出现我遇到禁用last_insert_id()时就很麻烦了。

数据量过大这个问题在xxl_job_log表设计上就有体现,作者给此表的主键设置为id bigint(20) NOT NULL AUTO_INCREMENT,

上面我提到的问题是在实际开发中和自身项目的业务要求产生的冲突,也不能完全归属到此开源系统的缺点里,顶多属于兼容性问题。

实际上如果不要求速度的话,是可以把id设置成varchar类型的,然后程序中用自定义的uuid来作为主键的存储。

这样依靠程序来生成id的方式既可以满足主键的存放,又可以在程序中获取到最新插入的主键id

使用uuid作为主键id的方式较为粗暴。后来经过考虑使用了雪花算法来生成id,较uuid的好处是生成的id为全数字形式的。而不是包含字母的32位字符串的uuid。

雪花算法生成id的规则,虽然没有自增主键那样效率好,但因自身生成规则的特点,在插入到数据库中时,保证了顺序自增。

所以,我对这个开源系统做了简单的二次开发,将数据库主键全部换成

id` bigint(20) NOTNULL 并且去掉自增。程序中对应的实体字段类型变为long

三、官方网址

最后贴出这个优秀的开源项目地址

项目地址:https://www.xuxueli.com/xxl-job/