浅谈分布式调度

211 阅读3分钟

文章内容输出来源:拉勾教育Java高薪训练营

为什么会有调度问题

什么是调度?

调度,也就是通俗讲的定时任务,它的形式是:每隔一段时间执行/在特定某一时刻执行。

调度(定时任务)的场景

  • 订单审核、出库
  • 订单超时⾃动取消、⽀付退款
  • 礼券同步、⽣成、发放作业
  • 物流信息推送、抓取作业、退换货处理作业
  • 数据积压监控、⽇志监控、服务可⽤性探测作业
  • 定时备份数据
  • ⾦融系统每天的定时结算
  • 数据归档、清理作业
  • 报表、离线数据分析作业

什么是分布式调度

分布式调度有两重含义:

1、调度任务运行在分布式集群环境下,同一个定时任务部署多份,但同时只应该有一个任务在跑;
2、定时任务的分布式,也就是定时任务的拆分,既把一个大的作业任务拆分为多个小的作业任务,同时执行。

如何实现分布式调度

定时任务的实现⽅式

定时任务的实现方式有多种,早期没有定时任务框架的时候,我们会使⽤JDK中的Timer机制和多线程机制(Runnable+线程休眠)来实现定时或者间隔⼀段时间执⾏某⼀段程序;后来有了定时任务框架,⽐如⼤名鼎鼎的Quartz任务调度框架,使⽤时间表达式(包括:秒、分、时、⽇、周、年)配置某⼀个任务什么时间去执⾏。

但是在分布式集群架构环境下,Quartz已经不能更好的满⾜我们需求,我们可以使⽤专业的分布式调度框架,比如Elastic-job

Elastic-Job

Elastic-Job是当当⽹开源的⼀个分布式调度解决⽅案,基于Quartz⼆次开发的,由两个相互独⽴的⼦项⽬Elastic-Job-Lite和Elastic-Job-Cloud组成。

这里只介绍Elastic-Job-Lite,一般情况下使用Elastic-Job-Lite就够了,它定位为轻量级⽆中⼼化解决⽅案,使⽤Jar包的形式提供分布式任务的协调服务,⽽Elastic-Job-Cloud⼦项⽬需要结合Mesos以及Docker在云环境下使⽤。

Elastic-Job的github地址

主要功能介绍

  • 分布式调度协调
    在分布式环境中,任务能够按指定的调度策略执⾏,并且能够避免同⼀任务多实例重复执⾏
  • 丰富的调度策略
    基于成熟的定时任务作业框架Quartz cron表达式执⾏定时任务
  • 弹性扩容缩容
    当集群中增加某⼀个实例,它应当也能够被选举并执⾏任务;当集群减少⼀个实例时,它所执⾏的任务能被转移到别的实例来执⾏。
  • 失效转移
    某实例在任务执⾏失败后,会被转移到其他实例执⾏
  • 错过执⾏作业重触发
    若因某种原因导致作业错过执⾏,⾃动记录错过执⾏的作业,并在上次作业完成后⾃动触发。
  • ⽀持并⾏调度
    ⽀持任务分⽚,任务分⽚是指将⼀个任务分为多个⼩任务项在多个实例同时执⾏。
  • 作业分⽚⼀致性
    当任务被分⽚后,保证同⼀分⽚在分布式环境中仅⼀个执⾏实例。