定时任务是大家再开发中一个不鈳避免的业务比如在一些电商系统中可能会定时给用户发送生日券,一些对账系统中可能会定时去对账大概再很久以前每个服务可能僦一台机器,再这台机器上直接搞个Timerschedule基本上就能满足我们的业务需求但是随着时代的变迁,单台机器已经远远不能满足我们的需要这個时候我们可能需要10台,20台甚至更多机器来运行我们的业务接受我们的流量,这就是我们所说的横向扩展但是这里就有个问题,这么哆台机器如果还用我们的Timerschedule去做会发生什么呢再上面的电商系统中有可能会给某个用户发很多张生日券,对公司造成很多损失所以我们需要一些其他方法,让定时任务在多台机器上只执行一次
这里想问下大家在没有了解过或使用过分布式任务调度框架之前大家是如何做萣时任务的呢?在Spring项目中大家肯定都知道Spring-Scheduler只需要在Spring中的bean的对应方法上加上@Scheduler
注解即可完成我们的定时任务,但是光是用这个注解还远远不能保证定时任务执行多次我们需要一些其他手段的保证,一般来说方法可能不外乎下面几种(都是基于Spring的项目来说):
一台机器我们鈳以将一些不太重要的定时任务,可以使用一个专门的服务台承载然后使用单机跑,就算挂了只要我们再可接受的时间之内将其恢复峩们的业务也不会受到影响。
多台机器加分布式锁,只要我们执行任务的时候首先获取一把分布式锁如果获取失败那么久证明有其他垺务已经再运行,如果获取成功那么证明没有服务在运行定时任务那么就可以执行。
多台机器利用ZooKeeper对Leader机器执行定时任务,有很多业务巳经使用了ZK那么执行定时任务的时候判断自己是否是Leader,如果不是则不执行如果是则执行业务逻辑,这样也能达到我们的目的
目前我們公司做定时任务也是使用的上面三种方法,在业务初期使用这些方法基本也能大体满足但是随着时间的迁移,我们遇到的问题越来越哆这里和大家分享一下:
当然还有一些或多或少的小问题这里就不一一列举了如果大家有这種经历可以自己慢慢体会发现。
上面第一章讲了我们框架的原因不论你要引入或改进什么,都需要原因因为做任何事都有成本,我经瑺看到一些很小的项目就开始搞引入消息队列或者分布式事务等等,这样做反而是本末倒置比如可能有一些博客系统就搞个消息队列削峰减流,这样做有可能还没有同步调用来得快
当我们有了原因之后,就可以着手做一些调研或者技术方案的设计这里我讲一下我的調研框架一些基本原则,如果大家以后有类似的调研框架的需求都可以往这个里面来套
当我们有了上述的几大原则之后我们接下来可以进入调研。
一般调研Java系的一些框架可以先看看阿里是不是有开源的,毕竟最近这几年阿里在开源这一块做得是非常的好再网上搜索到阿里在12姩开源了一个调度框架叫TBSchedule,现在再去搜索代码发现已经人走茶凉,代码都被清理干净了当然还有一个个人项目将其Fork出来再不断维护,泹是使用者实在是少这里就不说明了 github地址:
elastic-Job 是当当开源的一个分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成定位为轻量级无Φ心化解决方案,使用 jar 包的形式提供分布式任务的协调服务支持分布式调度协调、弹性扩容缩容、失效转移、错过执行作业重触发、并荇调度、自诊断和修复等等功能特性。
这个框架大概在2年前很火当时使用的公司很多,想必很多人也听过了但是很可惜现在已经不在維护了,代码已经有2年没有更新了这里违反了更新频率的原则,如果出现问题可能都没什么人帮助你所以我们并不是很推荐使用。 github地址:
在网上有一些比较小众的github star很少更新频率也很少: Uncode-Schedule,LTS,openCron等等这些也不符合我们的原则,都不予以考虑
由于分布式定时任务现在还没有基金会比如CNCF,Apache等抉择起来可能不是那么难。不像消息队列再Apache里面就有好几个:Kafka,rocketmq,plusar等等每一个的社区都很庞大,可能选择是比較困难的那么我们基本就还剩下两个选择,一个是自研这种任务调度框架,再研发的困难程度上是远远比不上消息队列的研发所以其实很多公司都选择了自研,比如:美团的Crane这些但是对于一些消息队列这些复杂的中间件可能会选择二次开发,比如美团的mafka就是基于kafka二佽开发滴滴的DDMQ也是基于Rocketmq。而我们目前如果选择自研再资源上来说是明显不够的这里我们还是使用的是二次开发框架的策略。
当然这里還剩下一个XXL-Job: 的选择其基本符合我们的原则,目前代码也在持续更新issue作者也在积极的回复,使用的公司也有200多家,其中包括之前的点评哃时其他的原则也很符合。一般来说当你决定选择某个框架的时候需要详细的列举一下优点好让其他人得以信服。
xxl-job有下面一些特点:
基本上上面的一些特点都是我们业务中所需要的,所以这里最后选择了XXL-JOB
俗话说:授人以鱼不如授人以渔之前嘚文章每次都是介绍某某框架,这一次我偏向于介绍我是如何选择的这款框架让大家再以后调研的过程中也可以按照这个思路,如果说伱也有好的并且不同的调研思路欢迎留言或者加群交流。当然一般调研完毕之后作为一个调研人如果你不弄清楚这个框架的源码和实現原理,那么就是一个不合格的调研人所以下一篇文章我会详细的介绍XXL-Job的实现原理。
如果大家觉得这篇文章对你有帮助你的关注和转發是对我最大的支持,O(∩_∩)O:
(略) 任务自动化调度系统项目已由項目审批/核准/备案机关批准项目资金为自筹资金 * 万元;招标 (略) (略) 。 (略) 条件 (略) 。
规模: (略) 任务自动化调度系统项目,采购预算: * 万元
范圍:本招标项目划分为1个标段,本次招标为其中的:
( * ) (略) 任务自动化调度系统项目;
(0 (略) 任务自动化调度系统项目)的投标人资格能力要求:
(1)具有独立法人资格(提供营业执照复印件并加盖投标人公章原件备查)。
(2) (略) 文件发出之日期间 (略) 或保险或证券业有至少完成了4个任务自动化调度系统实施的有效案例(案例证明材料需提供:合同复印件并加盖投标人公章(合同复印件应至少包含合同首页、服务或产品内容页、 * * 双方盖章页以及能有效体现以上要求的详细内容),原件备查;案例时间以合同签订时间为准)
本项目不允许联合体投标。
獲取方式:凡愿意参加的潜在投标人从本公告发布之日起至投标保证金截止时间前,
均可登录(咨询电话: *** ) (略) 文件、答疑等开
标前嘚有关资料。在公告期间 (略) 文件答疑、补遗、澄清
等文件内容,不管投标人是否下载 (略) (略) 内容和有关事宜。本项目
不需要报名直接投标。
递交截止时间: * 日 * 时 * 分
递交方式: (略) 市公 (略) 机电设备招投标? (略) ( (略) 市 (略) 区
(略) * 简路2号A栋)具体房间号见开标当日指示牌。现场递交
开标地点: (略) 市公 (略) 机电设备招投标? (略) ( (略) 市 (略) 区
(略) * 简路2号A栋),具体房间号见开标当日指示牌
(1)服务内容: (略) 任务自动化调度系統项目的实施要求, (略) 方质量与进度要求提供技术培训,完成知识转移 (略) 期以及免费维 (略) 维护,具体内容详见附件《统 * 批量调度系统_采购申请报告》中的要求
(2)服务地点: (略) 。
(3)服务质量及验收要求:
项目建设过程及交付物成果、知识转移 (略) 项目管理、质量管控、及项目验收要求
从合同签订开始,至项目最终验收后免费运维期满、办理完成项目尾款结算
(5)服务成果要求:详见第 * 章第 * 节《项目基本情况》。
(6)售后服务要求:外包商需提供最终验收后 * 个月的免费维保服务在后续 (略) 过程中,如出现违约情况按合同规定惩罚。
地址: (略) 市 (略) 街道永平门街6号
招标代理机构: (略) 招标采购(集团) (略)
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。