如何实现一个定时任务调度系统

任务调度系统的功能是定时的执行一些预设的任务,这个功能单从逻辑上看是比较简单的。比如,一个简单调度系统可能是在单个节点上运行一个这样的程序:

while true {
    check_and_execute_task()
    sleep(time_duration)
}

这个方式实现的调度系统有很多问题,比如说,如果这个节点故障了该怎么保证任务能够得到执行,或者说如果任务数量特别大,单个节点的存储能力不够,执行任务的cpu也不够,又该怎么处理。因此,为了使调度系统高可用,同时能够应对海量的任务,必须实现为分布式的架构,以此来消除单点,提升存储和计算能力。

调度系统的实现可以分为两个大的部分,一个是调度的逻辑,一个是任务的存储。我们分别来讨论一下。

调度逻辑

第一个要考虑的就是解决单点问题,将调度程序部署在多个节点上,以此保证即使某个节点故障,其他节点上的程序可以继续调度执行任务。如果按照这样的设计,调度程序必须是无状态的,加入一个新的调度程序实例到系统中,从现有系统中退出一个调度程序,应该都是对整个系统的运行没有影响的。按照这个思路,我们可以把读个调度程序做成类似消费者的机制:假设我们有一个任务池,其中记录着所有需要执行的任务,多个调度程序从任务池中争抢任务来执行。作为消费者,单个调度程序的故障不影响其他调度程序的执行。

另外一个问题是:在海量任务的情况下,如何保证所有到期的任务都能够尽快的得到执行。这个问题比较复杂,我们暂时只讨论两种情况。

不考虑优先级,将所有的任务看做一类。这样的话,假设到某一时刻需要执行的任务有一千万,那么按照调度程序的数量,将任务均分给这些调度程序就可以了。如果说还是感觉执行的太慢,可以增加调度程序的数据量(前提是cpu还有余力)。

考虑平等问题,也就是需要保证不同业务产生的任务都能够尽快执行。比如说,现在系统中的任务是由两个业务模块产生的。业务A产生的定时任务有一千万条,业务B的定时任务只有100条,然后他们的任务执行时间是相同的。那么到执行的时候,可能出现一个情况:所有的调度程序都去执行业务A的任务了,业务B的任务则长时间得不到执行。
解决这个问题的思路是将调度程序和业务绑定起来,比如说设置两个调度程序专门去执行业务B产生的任务,只有不存在业务B的任务时才去处理其他任务。这样就保证了每个业务的任务都能够得到公平的执行机会。(这个方法会使得业务模块和调度系统耦合,不过这不算是个大问题,毕竟耦合这个东西在大多数实际工程项目都是普遍存在的-_-)。

任务的存储

每一个任务都是需要持久化存储的,这一点毋庸置疑。此外,由于任务都是定时执行的,所以一个直观的思路是按照时间顺序来存储任务,或者说,使用一个能够提供按照时间顺序来查询数据的数据库。mysql首先排除,因为mysql是单机数据库,支持的容量太小,如果使用分库分表的方法,那么多个表之间也没法保持时间顺序。首选的数据库应该是分布式数据库,同时key是有序的,比如hbase,tikv等。此外,如果考虑上面提到的按业务来调度,那么还需要能够按照业务来查询任务,也就是支持两个维度的查询:时间、业务,在hbase、tikv这样的数据库中,通过设置key的格式,很容易达到这个目标。

另外一个需要考虑的问题是,如何保证任务状态的一致性。比如说一个任务现在已经执行完成了,需要从数据库中删除这个任务,如果此时调度程序崩溃了,可能导致任务被重复执行。解决这个问题有两个思路:1、将任务执行完成和删除任务的动作放到一个事务中,即要么执行完成+删除任务同时操作,要么都不操作。这个目前看是没法实现的,在分布式的架构中做事务一直是个困难的事情,更不用说这里任务的执行可能是在其他系统中进行的。2、保证每个任务的执行都是幂等的,即重复执行一个任务对业务无影响。实现幂等需要业务模块来做,不过相对来说,这个方式更容易。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354