文章目录

  • quartz
  • TBSchedule
  • elastic-job
  • Elastic-Job-Lite-Console
  • Saturn
  • cron


在很多应用系统中我们常常要定时执行一些任务。比如,订单系统的超时状态判断、定时发短信,定时同步数据等等。常见的处理方式有线程的while(true) 和sleep组合、使用Timer定时器触发任务又或者是使用quartz框架。
有些时候为了系统的高可用性,避免单机系统出现故障或更高的处理效率,会采用分布式的定时任务。业内常用的分布式定式任务解决方案主要有quartz、淘宝的TBSchedule和当当的elastic-job。

quartz

quartz基于数据库实现分布式。在数据库中记录所有的job定义,如果某一个节点失效,那么Job会在其他节点上执行。使用了数据库锁,保证一个任务只在一台机器上运行。在数据库中有张表scheduler_locks,quartz采用了悲观锁的方式对triggers表进行行加锁,以保证任务同步的正确性。一旦某一个节点上面的线程获取了该锁,那么这个Job就会在这台机器上被执行,同时这个锁就会被这台机器占用。同时另外一台机器也会想要触发这个任务,但是锁已经被占用了,就只能等待,直到这个锁被释放。之后会看trigger状态,如果已经被执行了,则不会执行了。

quartz的缺点是,对于大量的短任务,各个节点都会抢占数据库锁,这样就出现大量的线程等待资源。这种情况随着节点的增加会越来越严重。而且quartz没有解决任务分片的问题,还是会存在单机处理的极限。

TBSchedule

TBSchedule广泛应用于很多互联网企业。tbschedule在时间调度方面虽然没有quartz强大,但是它支持分片功能。tbschedule使用ZooKeeper来实现任务调度的高可用和分片。

elastic-job

Elastic-Job当当开源的分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。一般我们只要使用Elastic-Job-Lite就好。
elastic-job结合了quartz非常优秀的时间调度功能,并且利用ZooKeeper实现了灵活的分片策略。除此之外,还加入了大量实用的监控和管理功能,以及其开源社区活跃、文档齐全、代码优雅等优点,是分布式任务调度框架的推荐选择。

Elastic-Job-Lite-Console

它和Elastic-Job-Lite是两个完全不关联的应用程序,使用ZooKeeper来交换数据,管理人员可以通过这个界面查看、监控和管理Elastic-Job-Lite的任务,必要的时候还能手动触发任务。

Saturn

Saturn是唯品会在github开源的一款分布式任务调度产品。它是基于当当elastic-job来开发的,其上完善了一些功能和添加了一些新的feature。Saturn的任务可以用多种语言开发比如python、Go、Shell、Java、Php。

cron

在LINUX中,周期执行的任务一般由cron这个守护进程来处理.特点简单