首页 > 编程知识 正文

基于数据库的分布式定时任务,轻量级分布式定时任务

时间:2023-05-03 19:47:41 阅读:13116 作者:4002

文章目录前言什么是分布式计时器任务? 分布式调度任务含义调度任务与消息队列的区别分布式调度任务解决方案分时解决方案HA高可用性解决方案多心跳方式任务抢占方式任务轮询抢占方式分布式调度任务调度框架

前言什么是分布式计时器任务?

将分布式、不可靠的规划任务嵌入统一的平台中,实现集群管理调度和分布式配置的调度任务管理方式称为分布式调度任务。

这有两个意义:

这是在分布式群集环境中执行的计划任务,如果部署了多个相同的计划任务程序,则必须确保同一时间只能执行一个计划任务。 定时任务的分割是指将一个大的工作任务分割成多个小的工作任务,同时执行。 分布式计时器任务的含义为什么要使用分布式计时器任务? 主要原因有以下两个。

高可用:独立版的平台任务调度只能在一台计算机上运行。 如果程序或系统出现异常,功能将无法使用,但这对于某些核心系统功能来说是不可接受的。

单机性能瓶颈:单机能力有限,主要是CPU、内存、磁盘。 随着任务量的增加,有时单体处理不完。

分布式定时任务使用场景:

订单审核、签出、订单超时自动取消和生成退款优惠券、发布和过期物流信息推送和状态更新数据积压监测、日志监测、服务可用性检测工作定时备份和更新数据金融系统每日结算定时月度

功能比较简单,交互性差,任务部署效率低,开发和维护成本比较高,不能很好地满足各系统定时任务的管理和控制,尤其在多系统环境下更为突出; 许多任务是独立部署的,很难跟踪和警告不可用的任务。单点定时任务的缺点:

通过以集群方式进行管理调度,大大降低了开发和维护成本。分布式配置确保了系统的高可用性、可扩展性、负载均衡,提高了容错能力。 由于可以使用控制台部署和管理计划任务,因此这两个任务都是灵活高效的。它们都持久化在数据库中,避免了停机和数据丢失带来的风险,同时具有完整的任务失败重做机制、详细的任务跟踪和警报策略定时任务和消息队列的区别分布式定时任务的优势:

在异步处理(例如,注册、订购事件可用于APP去耦)定时任务工作和MQ均可作为两个APP之间的齿轮实现APP去耦流量的减少的电子商务大规模促销时,任务工作和MQ可用于流量平滑后端系统根据服务能力定时处理订单,或者在MQ获得订单后发生订单到来的事件时触发处理,对前端用户来说看,结果订单成功到达http://ww.Sina

定时任务工作由时间驱动,MQ由事件驱动; 时间驱动是不可替代的。 例如,金融系统的每个利息结算,不是一到利息就计算一个,而是按定时任务基于时间节点批量计算的分布式定时任务解决方案的分时方案严格划分时间片,交替执行计划任务。 主系统停机后,备用系统仍会运行,但处理周期会延长。

缺点:周期延长了。

HA高可用性方案在正常情况下发现主系统启动,备份系统待机,心跳检测发现主系统发生故障,备份系统启动。

缺点:单个系统不能平衡负载,只能垂直扩展,也就是硬件级升级,不能水平扩展。

多重心跳方案采用多重心跳,进行服务级、进程级、IP和端口级心跳检查。 正常情况下主系统运行,备用系统待机,心跳检查主系统发生故障,备用系统启动,再次检测到主系统运行时,将执行权返回主系统。

缺点:开发复杂,要求程序稳健性。

任务抢占方案a、b两台服务器必须同时运行,且启动必须前后分开。 谁先启动谁先锁定,其他服务器只能等待。 他们同时监视互斥锁,一旦发现锁被释放,其他服务就会先抢它,在其执行、执行之前进行互斥锁。

优点:可以进一步扩展多服务器。

缺点:开发难度大,会出现死锁问题。

任务优先级排队方案在每个服务器首次启动时加入队列

每次执行任务时,首先判断自己是否是当前可执行的任务,如果是,则执行;

如果不是当前正在执行的任务,请检查自己是否排队,如果没有排队,请加入队列。

分布式时间任务调度框架quartz 共同点

在java编程中,常见的著名任务调度工具是Quartz,该工具提供了丰富的接口来帮助实现基于Cron的

Expression的定时任务、以一定的频率执行任务等。 运行时,该工具会创建线程池,所有任务都在线程池中执行。 默认线程池中线程数有限,只需10个线程,即可通过编程更改线程池的容量。 如果提交的job大于线程池的容量,额外的job将在队列中等待。 如果已提交的job属于长时间运行或被阻止的任务,并且这些job大于线程池的容量,则某些job将无法长时间排队运行,调度程序将处于被阻止状态。 可以通过增加线程池的容量来解决此问题。

Quartz也支持分布式实现,任务的状态信息存储在数据库中,并基于数据库引擎和High

-Available 的策略(集群的一种策略)自动协调每个节点的
Quartz。不过Quartz在实现过程中效率相对低下,因为对于任务量比较大的场景下,会涉及到频繁的任务切换,进而会涉及频繁的加锁和解锁,甚至会带来集群间的主线程等待。

Job:表示一个工作,要执行的具体内容。此接口中只有一个方法
void execute(JobExecutionContext context)

JobDetail:表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。

Trigger代表一个调度参数的配置,什么时候去调用。

Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

上图三个节点在数据库中都拥有同一份Job定义,如果某一个节点失效,那么Job会在其他节点上执行。由于三个节点上的Job执行代码是一样的,那么怎么保证只有在一台机器上触发呢?

答案是使用了数据库锁。在quartz的集群解决方案里有张表scheduler_locks,quartz采用了悲观锁的方式对triggers表进行行加锁,以保证任务同步的正确性。一旦某一个节点上面的线程获取了该锁,那么这个Job就会在这台机器上被执行,同时这个锁就会被这台机器占用。同时另外一台机器也会想要触发这个任务,但是锁已经被占用了,就只能等待,直到这个锁被释放。之后会看trigger状态,如果已经被执行了,则不会执行了。

优点:

保证节点高可用 (HA), 如果某一个几点挂了, 其他节点可以顶上

缺点:

同一个任务只能有一个节点运行,其他节点将不执行任务,性能低,资源浪费当碰到大量短任务时,各个节点频繁的竞争数据库锁,节点越多这种情况越严重,造成性能会很低下quartz 的分布式仅解决了集群高可用的问题,并没有解决任务分片的问题,不能实现水平扩展,还是会有单机处理的极限 elastic-job

介绍

elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 , 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。

Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。

Elastic-Job-Cloud使用Mesos + Docker(TBD)的解决方案,额外提供资源治理、应用分发以及进程隔离等服务

特点

定时任务 :基于成熟的定时任务作业框架Quartz cron表达式执行定时任务;作业注册中心 :基于Zookeeper实现全局作业注册控制中心。用于注册,控制和协调分布式作业执行。作业分片 :将要给任务分片成多个小任务项到多服务器上同时执行;弹性扩容缩容 :运行中的作业服务器崩溃,或新增N台作业服务器,作业框架将在下次作业执行前重新分片,不影响当前作业执行;

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

xxl-job

介绍

精明的发箍个人开源的一个轻量级分布式任务调度框架 ,主要分为 调度中心和执行器两部分 ,调度中心在启动初始化的时候,会默认生成执行器的RPC代理。对象(http协议调用), 执行器项目启动之后, 调度中心在触发定时器之后通过jobHandle来调用执行器项目里面的代码,核心功能和elastic-job差不多,同时技术文档比较完善。

GitHub地址:https://github.com/xuxueli/xxl-job

设计思想:

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性。

系统组成:

调度模块(调度中心) : 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。执行模块(执行器) : 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等。

与quartz对比:

有任务管理界面,操作人性化调度逻辑和QuartzJobBean任务解耦,quartz是耦合在同一个项目中的,调度任务数量逐渐增多,调度任务逻辑逐渐加重的情况下,调用系统的性能将大大受限于业务。quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大;而XXL-JOB通过执行器实现“协同分配式”运行任务,充分发挥集群优势,负载各节点均衡。支持多种模式的定时任务, GLUE模式(Shell) + GLUE模式(Python) + GLUE模式(NodeJS)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。