安卓开发Android开发Android开发

怎样选型一个合适的框架-分布式任务调度框架选型

2019-07-15  本文已影响4人  6ad3c4d9ae59

背景

定时任务是大家再开发中一个不可避免的业务,比如在一些电商系统中可能会定时给用户发送生日券,一些对账系统中可能会定时去对账。大概再很久以前每个服务可能就一台机器,再这台机器上直接搞个Timerschedule基本上就能满足我们的业务需求,但是随着时代的变迁,单台机器已经远远不能满足我们的需要,这个时候我们可能需要10台,20台甚至更多机器来运行我们的业务,接受我们的流量,这就是我们所说的横向扩展。但是这里就有个问题,这么多台机器如果还用我们的Timerschedule去做会发生什么呢?再上面的电商系统中有可能会给某个用户发很多张生日券,对公司造成很多损失,所以我们需要一些其他方法,让定时任务在多台机器上只执行一次。

这里想问下大家在没有了解过或使用过分布式任务调度框架之前大家是如何做定时任务的呢?在Spring项目中大家肯定都知道Spring-Scheduler,只需要在Spring中的bean的对应方法上加上 @Scheduler 注解即可完成我们的定时任务,但是光是用这个注解还远远不能保证定时任务执行多次,我们需要一些其他手段的保证,一般来说方法可能不外乎下面几种(都是基于Spring的项目来说):

一台机器
我们可以将一些不太重要的定时任务,可以使用一个专门的服务台承载,然后使用单机跑,就算挂了只要我们再可接受的时间之内将其恢复,我们的业务也不会受到影响。

多台机器
加分布式锁,只要我们执行任务的时候首先获取一把分布式锁,如果获取失败那么久证明有其他服务已经再运行,如果获取成功那么证明没有服务在运行定时任务,那么就可以执行。

多台机器
利用ZooKeeper对Leader机器执行定时任务,有很多业务已经使用了ZK,那么执行定时任务的时候判断自己是否是Leader,如果不是则不执行,如果是则执行业务逻辑,这样也能达到我们的目的。

目前我们做定时任务也是使用的上面三种方法,在业务初期使用这些方法基本也能大体满足,但是随着时间的迁移,我们遇到的问题越来越多,这里和大家分享一下:

目前我们使用定时任务的时候,如果想让它马上执行一次,这个时候可能就需要额外再写一个Rest接口或者再另外写一个单独的Job。

无法暂停我们的定时任务,当我们的定时任务可能出现一些问题,比如一些定时报警的需求,当报警突然变得很多,这个时候需要暂停一下让其停止发送报警,这个时候可能我们可以用一些分布式配置的开关去做,再逻辑中判断定时任务开关是否打开,然后来做。这样做虽然也比较简单,但是我们这样需要新添加一些与任务无关的逻辑。

缺少对定时任务的监控,任务失败之后开发人员无从得知,有人说不是有Error日志吗,如果一个Error日志就一次报警那你们的服务能受得了吗,一般来说连续几次Error才会触发报警,而我们定时任务的周期性的特性是不容易触发连续的Error。

当然还有一些或多或少的小问题这里就不一一列举了,如果大家有这种经历可以自己慢慢体会发现。

调研的基本原则

上面第一章讲了我们框架的原因,不论你要引入或改进什么,都需要原因,因为做任何事都有成本,我经常看到一些很小的项目就开始搞引入消息队列,或者分布式事务等等,这样做反而是本末倒置,比如可能有一些博客系统就搞个消息队列削峰减流,这样做有可能还没有同步调用来得快。

当我们有了原因之后,就可以着手做一些调研或者技术方案的设计。这里我讲一下我的调研框架一些基本原则,如果大家以后有类似的调研框架的需求都可以往这个里面来套。

能否解决当前的痛点:这个是最重要的,如果连你问题都解决不了那使用这个还有什么意义呢?

当我们有了上述的几大原则之后,我们接下来可以进入调研。

调研框架

github地址:https://github.com/taobao/TBSchedule

这个框架大概在2年前很火,当时使用的公司很多,想必很多人也听过了,但是很可惜现在已经不在维护了,代码已经有2年没有更新了,这里违反了更新频率的原则,如果出现问题可能都没什么人帮助你,所以我们并不是很推荐使用。

github地址:https://github.com/elasticjob/elastic-job-lite

Uncode-Schedule,LTS,openCron等等,这些也不符合我们的原则,都不予以考虑

当然这里还剩下一个XXL-Job:http://www.xuxueli.com/xxl-job 的选择,其基本符合我们的原则,目前代码也在持续更新,issue作者也在积极的回复,使用的公司也有200多家,其中包括之前的点评,同时其他的原则也很符合。一般来说当你决定选择某个框架的时候需要详细的列举一下优点,好让其他人得以信服。

xxl-job有下面一些特点:

简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;

动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;

基本上上面的一些特点都是我们业务中所需要的,所以这里最后选择了XXL-JOB

上一篇下一篇

猜你喜欢

热点阅读