当前位置: 首页 > article >正文

【定时任务】定时任务技术实现原理和选型分析

定时任务的背景

在业务开发中,一定会遇到比如每天9点发送一个邮件,30分钟超时订单自动取消等 业务场景,一般都需要使用定时任务来解决,不同的语言也都提供了对应的内置定时任务。

其实如果对于一个单机实例来说,直接启动一个任务执行执行完成,这没有什么问题,但是在多实例分布式下,实例A 和 实例B 都是用单机定时任务,那么就会出现重复执行的场景。

我接触到的有一种解决方案,那就是通过redis 分布式锁的方式,避免重复执行,有多个实例,谁先抢到锁,谁去执行。
在这里插入图片描述
本质 其实通过一个分布式互斥资源 保证 谁获取到谁执行,那么mysql zk等都可以实现。
只不过这种方式需要自己去维护多个实例的是否要执行的状态。

定时任务选型

在这里插入图片描述
目前业界比较主流的方案单机任务和分布任务,对于单机版本 大多数都是用Spring,通过cron表达式。Kafka 和 netty 提供了另外一个思路就是通过时间轮机制,这种方式可以更高效率的管理和执行任务,避免JDK的定时任务 堆型的O(N)的时间复杂度

Netty时间轮实践与源码解析

分布式定时调度任务

如果只是简单的几个定时任务,仅仅使用多实例+锁的方式就可以满足,但是对于一个业务线来说,可能有很多定时任务,需要可视化的管理。所以就需要包含

1.任务的管理:创建,编辑、删除、查看等
2.任务的启动:启动,停止,重启
3.任务的调度的历史记录,执行情况等。

这样的话就可以很方便的管理定时调度任务。但是当任务过多的时候,就需要采用分布式多实例的部署,以及数据分片机制的管理。

数据分片机制
说白了就是当一个任务需要执行多少数据,A实例执行一部分,B实例执行一部分。提升系统的并发度。
在这里插入图片描述

Quartz

Quartz基于数据库来实现任务的分配。
在这里插入图片描述
核心原理是 每个阶段默认20S会查询数据库的QRTZ_TRIGGERS,不断获取并和其他节点抢占triiger,一旦获取triiger的控制权,本次任务就由调度器执行。
在这里插入图片描述

XXL-JOB

在这里插入图片描述
XXL-JOB的核心是将调度抽象成一个调度中心,将任务的调度和执行进行分离,类似存算分离的思想,这样职责上更单一和清晰。

在这里插入图片描述


http://www.kler.cn/a/430670.html

相关文章:

  • 【ES6复习笔记】Class类(15)
  • 【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
  • JOGL 从入门到精通:开启 Java 3D 图形编程之旅
  • Vue开发环境搭建上篇:安装NVM和NPM(cpnm、pnpm)
  • Scala课堂小结
  • WPS工具栏灰色怎么办
  • 分析比对vuex和store模式
  • vue-生命周期
  • 力扣 螺旋矩阵-54
  • vscode 配置C/C++环境控制台参数
  • 【FLASH、SRAM和DRAM、CISC和RISC、冯诺依曼和哈佛】单片机内存结构的了解
  • 网页核心页面设计(第5章)
  • 给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题
  • Win11家庭版安装Docker,解决engine stopped问题
  • 初始数据结构
  • 电脑文件夹打不开了,能打开但是会闪退,提示“找不到iUtils.dll”是什么原因?
  • 电脑运行时提示“0x80240037”错误,提示安装ie插件或其他微软程序时,报错提示“未指定的错误”是什么原因?以及要怎么解决和预防?
  • AUTOSAR AP和CP的安全要求规范(Safety Req)详细解读
  • SQL注入--堆叠注入
  • [漏洞挖掘与防护] 05.CVE-2018-12613:phpMyAdmin 4.8.1后台文件包含缺陷复现及防御措施
  • 【Java EE】Spring请求如何传递参数详解
  • Mac电脑钓鱼到拿下核心权限
  • GC常见垃圾回收算法,JVM分代模型
  • 鸿蒙手机文件目录
  • k8s配置Pod 优先级
  • Python爬虫——HTML中Xpath定位