目录
什么是分布式调度?
指系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人力由系统自动去执行任务
任务调度算法可分为:事件驱动调度算法、时钟驱动调度算法
通常任务调度的程序是集成在应用中,由于采用分布式架构,一个服务往往会部署多个冗余实例来运行业务,在这种分布式系统环境下运行任务调度,称之为分布式任务调度
比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序
(1)事件驱动调度算法
根据事件的先后以及任务的优先级安排任务的执行。事件驱动调度依赖外部硬件设备,通过产生中断方式为任务调度提供信号。分两种:
①集成事件驱动调度(Integrated Event-Driven Scheduling)
中断的优先级与任务的优先级相对应,中断只有在其优先级高于正在执行的任务时才会被处理器响应
在集成事件驱动调度中,任务调度和事件驱动机制紧密集成在一起,共享同一个事件驱动调度器。当外部硬件设备产生中断信号时,事件驱动调度器会立即响应并决定下一个要执行的任务。这种调度方式将任务的执行与外部事件的发生紧密联系在一起,实现实时响应和高效的任务调度。
②非集成事件驱动调度(Non-Integrated Event-Driven Scheduling)
任务通过外部中断启动,中断优先级与相关任务优先级没有关系
在非集成事件驱动调度中,任务调度和事件驱动机制是独立的。外部硬件设备产生中断信号后,通过中断处理程序将事件通知给任务调度器。任务调度器根据事件的优先级和任务的优先级来决定下一个要执行的任务。这种调度方式将任务调度和事件处理解耦,提供了更大的灵活性和可扩展性。
(2)时钟驱动调度算法
一般用于周期任务
分布式调度要实现的目标
不管是任务调度程序集成在应用程序中,还是单独构建的任务调度系统,如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建,这样就可以具有分布式系统的特点,并且提高任务的调度处理能力
1.并行任务调度
并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。
每个部分都可以独立部署,服务之间交互通过网络进行通信,比如:订单服务、商品服务
如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。
2.高可用
若某一个实例宕机,不影响其他实例来执行任务。
每个部分都可以集群部分,保证高可用
3.弹性扩容
当集群中增加实例就可以提高并执行任务的处理效率。
每个部分都可以集群方式部署,并可针对部分结点进行硬件及软件扩容,具有一定的伸缩能力
4.任务管理与监测
对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。
5.避免任务重复执行
当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以需要控制相同的任务在多个运行实例上只执行一次
分布式锁:多个实例在任务执行前首先需要获取锁,如果获取失败那么久证明有其他服务已经再运行,如果获取成功那么证明没有服务在运行定时任务,那么就可以执行
常用的任务调度框架
1.Quartz
调用API的的方式操作任务,不人性化;需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。调度逻辑和任务耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况加,此时调度系统的性能将大大受限于业务;
Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能
2.xxl-job
侧重的业务实现的简单和管理的方便,学习成本简单,失败策略和路由策略丰富。推荐使用在“用户基数相对少,服务器数量在一定范围内”的情景下使用
3.Elastic-Job
关注的是数据,增加了弹性扩容和数据分片的思路,以便于更大限度的利用分布式服务器的资源。但是学习成本相对高些,推荐在“数据量庞大,且部署服务器数量较多”时使用