定时任务是你们再开发中一个不可避免的业务,好比在一些电商系统中可能会定时给用户发送生日券,一些对帐系统中可能会定时去对帐。大概再好久之前每一个服务可能就一台机器,再这台机器上直接搞个Timerschedule基本上就能知足咱们的业务需求,可是随着时代的变迁,单台机器已经远远不能知足咱们的须要,这个时候咱们可能须要10台,20台甚至更多机器来运行咱们的业务,接受咱们的流量,这就是咱们所说的横向扩展。可是这里就有个问题,这么多台机器若是还用咱们的Timerschedule去作会发生什么呢?再上面的电商系统中有可能会给某个用户发不少张生日券,对公司形成不少损失,因此咱们须要一些其余方法,让定时任务在多台机器上只执行一次。git
这里想问下你们在没有了解过或使用过度布式任务调度框架以前你们是如何作定时任务的呢?在Spring项目中你们确定都知道Spring-Scheduler,只须要在Spring中的bean的对应方法上加上@Scheduler
注解便可完成咱们的定时任务,可是光是用这个注解还远远不能保证定时任务执行屡次,咱们须要一些其余手段的保证,通常来讲方法可能不外乎下面几种(都是基于Spring的项目来讲):github
一台机器,咱们能够将一些不过重要的定时任务,可使用一个专门的服务台承载,而后使用单机跑,就算挂了只要咱们再可接受的时间以内将其恢复,咱们的业务也不会受到影响。框架
多台机器,加分布式锁,只要咱们执行任务的时候首先获取一把分布式锁,若是获取失败那么久证实有其余服务已经再运行,若是获取成功那么证实没有服务在运行定时任务,那么就能够执行。分布式
多台机器,利用ZooKeeper对Leader机器执行定时任务,有不少业务已经使用了ZK,那么执行定时任务的时候判断本身是不是Leader,若是不是则不执行,若是是则执行业务逻辑,这样也能达到咱们的目的。性能
目前咱们公司作定时任务也是使用的上面三种方法,在业务初期使用这些方法基本也能大致知足,可是随着时间的迁移,咱们遇到的问题愈来愈多,这里和你们分享一下:设计
固然还有一些或多或少的小问题这里就不一一列举了,若是你们有这种经历能够本身慢慢体会发现。日志
上面第一章讲了咱们框架的缘由,不论你要引入或改进什么,都须要缘由,由于作任何事都有成本,我常常看到一些很小的项目就开始搞引入消息队列,或者分布式事务等等,这样作反而是本末倒置,好比可能有一些博客系统就搞个消息队列削峰减流,这样作有可能尚未同步调用来得快。code
当咱们有了缘由以后,就能够着手作一些调研或者技术方案的设计。这里我讲一下个人调研框架一些基本原则,若是你们之后有相似的调研框架的需求均可以往这个里面来套。中间件
当咱们有了上述的几大原则以后,咱们接下来能够进入调研。接口
通常调研Java系的一些框架,能够先看看阿里是否是有开源的,毕竟最近这几年阿里在开源这一块作得是很是的好,再网上搜索到阿里在12年开源了一个调度框架叫TBSchedule,如今再去搜索代码,发现已经人走茶凉,代码都被清理干净了。固然还有一个我的项目将其Fork出来再不断维护,可是使用者实在是少这里就不说明了。 github地址:https://github.com/taobao/TBSchedule
elastic-Job 是当当开源的一个分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。支持分布式调度协调、弹性扩容缩容、失效转移、错过执行做业重触发、并行调度、自诊断和修复等等功能特性。
这个框架大概在2年前很火,当时使用的公司不少,想必不少人也听过了,可是很惋惜如今已经不在维护了,代码已经有2年没有更新了,这里违反了更新频率的原则,若是出现问题可能都没什么人帮助你,因此咱们并非很推荐使用。 github地址:https://github.com/elasticjob/elastic-job-lite
在网上有一些比较小众的github star不多,更新频率也不多: Uncode-Schedule,LTS,openCron等等,这些也不符合咱们的原则,都不予以考虑
因为分布式定时任务如今尚未基金会好比CNCF,Apache等,抉择起来可能不是那么难。不像消息队列再Apache里面就有好几个:Kafka,rocketmq,plusar等等,每个的社区都很庞大,可能选择是比较困难的。那么咱们基本就还剩下两个选择,一个是自研,这种任务调度框架,再研发的困难程度上是远远比不上消息队列的研发,因此其实不少公司都选择了自研,好比:美团的Crane这些。可是对于一些消息队列这些复杂的中间件可能会选择二次开发,好比美团的mafka就是基于kafka二次开发,滴滴的DDMQ也是基于Rocketmq。而咱们目前若是选择自研再资源上来讲是明显不够的,这里咱们仍是使用的是二次开发框架的策略。
固然这里还剩下一个XXL-Job:http://www.xuxueli.com/xxl-job 的选择,其基本符合咱们的原则,目前代码也在持续更新,issue做者也在积极的回复,使用的公司也有200多家,其中包括以前的点评,同时其余的原则也很符合。通常来讲当你决定选择某个框架的时候须要详细的列举一下优势,好让其余人得以信服。
xxl-job有下面一些特色:
基本上上面的一些特色都是咱们业务中所须要的,因此这里最后选择了XXL-JOB
俗话说:授人以鱼不如授人以渔,以前的文章每次都是介绍某某框架,这一次我偏向于介绍我是如何选择的这款框架,让你们再之后调研的过程当中也能够按照这个思路,若是说你也有好的而且不一样的调研思路,欢迎留言或者加群交流。固然通常调研完毕以后,做为一个调研人若是你不弄清楚这个框架的源码和实现原理,那么就是一个不合格的调研人,因此下一篇文章我会详细的介绍XXL-Job的实现原理。
若是你们以为这篇文章对你有帮助,你的关注和转发是对我最大的支持,O(∩_∩)O: