大型系统的任务调度模块实现思路

news2024/12/23 4:18:47

产品需求:需要一个任务调度模块,用户可以通过页面去新建任务,任务主要就是定时发送邮件,或者每周几去发送邮件,用户可以自定义发送的规则,且用户可以暂停任务、删除任务,也能知道任务的执行情况。

一. spring框架的@Scheduled 注解

传统的定时任务可以用spring框架的@Scheduled 注解来实现定时任务

 

如上图,我们在项目中就是利用@Scheduled注解配合cron表达式来实现每分钟同步数据的效果。这样也实现了定时任务的功能。

思考: 这样实现定时任务有什么弊端?

弊端一:如果单点架构要做负载均衡,则任务有可能会启动多次,严重的话可能会导致数据不一致问题,引发并发问题。分布式架构中如果任务模块只部署一个,虽然可以确保任务同一时间只运行一次,但无法保证高可用。

解决方式:引入分布式锁

 

如上图所示,在用户模块中写了同步浙政钉全量用户的脚本,通过定时任务启动。该任务模块中引入了redis分布式锁,保证同一时间只有一个定时任务会执行

弊端二:任务一旦启动,无法做到监管控制。例如:如果这个任务不想继续执行了,或者需要修改执行间隔,只能通过修改编码重新发布来达成。

二. Jdk自带的Timer、TimerTask实现定时任务

来看实现:

 

首先定义了Timer调度器,其次定义了TimerTask来定义任务,除了常规的执行定时任务以外,timer调度器还提供了cancel方法来取消执行,所以从一定程度上做到了对运行中任务的管控。

   

    这种方式有何弊端呢?

分析源码:

Sched方法核心是将任务加入到一个队列中,且此方法加了锁,那么通过分析此段源码可以得出结论:timer线程安全,且是一个单线程操作。

 

接下来看核心代码:如何去触发定时任务

 

通过无限轮询(没有线程休眠)来实时判断任务是否需要执行。并且异常处理中只catch了

InterruptedException异常,这就意味着如果你的任务中抛出了运行时异常,就会杀死线程。

通过源码分析可以轻易的得出timer的弊端:

  1. 性能一般
  2. 定时器只有一个执行线程,如果遇见异常后面所有任务都会被取消掉(ScheduledThreadPoolExecutor实现了多线程解决了这个问题,有兴趣可以去了解下,不做详细解释了)
  3. 所有的任务都放在内存队列中,一旦服务重启或者任务失败,所有数据都会丢失,没有持久化。

三. Quartz框架

Quartz框架是一个开源的作业调度框架

它基于调度器(scheduler),job,jobdetail来实现任务调度

 

 

Scheduler调度器接口中提供了 增加工作,删除工作,暂停工作恢复工作的api接口,可以让开发人员自由地结合业务来实现各种各样的需求。

 

另外quartz也结合了多线程优化,持久化策略(可以结合jdbc),集群策略。

四.Xxl-job框架

   

 

是一个基于springboot的开源项目,提供了可视化界面,上手比较容易。

但个人感觉过度封装了,对于开发来讲,只需要提供底层能力即可,这种通过可视化界面去新增cron表达式,来触发定时任务的可能如果是纯技术的定时任务可以采用这个框架,如果是业务层面的定制化开发,那修改的成本会比较高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查找-多路查找详解篇

多路查找树 多路查找树(Multway Search Tree)是一种高级的树形数据结构,它 允许每个节点有多个子节点(通常大于等于2)。多路查找树的每个节点 可以存储多个关键字和对应的值。分类 2-3树(2-3 Tree&#x…

红队打靶,红日系列,红日靶场5

文章目录 靶场详情外网渗透端口扫描漏洞发现与利用获取shell 内网渗透提权内网信息收集 横向移动上线msf路由转发与代理通道Psexec 攻击 靶场详情 此次靶场虚拟机共用两个,一个外网一个内网,用来练习红队相关内容和方向,主要包括常规信息收集…

Eurographics 2023最新综述:图形学中的神经-符号模型

随着 CVPR 2023 Best Paper 的公布,其中一篇名为 VISPROG 的工作引起了广泛关注。这项工作利用自然语言指令解决复杂且组合性的视觉任务,重新将神经-符号方法带回了人们的视野,并证明了计算机视觉社区对这种方法的认可。实际上,VI…

Unity自定义后处理——用偏导数求图片颜色边缘

大家好,我是阿赵。   继续介绍屏幕后处理效果的做法。这次介绍一下用偏导数求图形边缘的技术。 一、原理介绍 先来看例子吧。   这个例子看起来好像是要给模型描边。之前其实也介绍过很多描边的方法,比如沿着法线方向放大模型,或者用Ndo…

数据结构和算法——排序算法的比较和排序综测测验

目录 排序算法的比较 排序综合测验 快又稳定 元素错位 有序排序 排序结果 排序算法的比较 排序方法平均时间复杂度最坏情况下时间复杂度额外空间复杂度稳定性简单选择排序不稳定冒泡排序稳定直接插入排序稳定希尔排序不稳定堆排序不稳定快速排序不稳定归并排序稳定基数排…

SCT2632——65V输出3A非同步整流DCDC转换器

SCT2632是一款3A降压转换器,具有宽输入电压,从4.2V到60V,集成了220mΩ高压侧MOSFET。SCT2632采用峰值电流模式控制,支持脉冲跳过调制(PSM),以帮助转换器在轻负载或待机状态下实现高效率条件。SC…

矿用人员定位系统在矿山事故预防中的效果评估

矿业行业的高风险和复杂环境使得采矿安全成为一项重要的挑战。为了保障矿工的安全并减少事故风险,矿用人员定位系统成为了关键技术之一。 在这篇文章中,华安联大便和大家各位朋友一起探讨矿用人员定位系统的重要性、工作原理、作用,并通过真…

Packet Tracer - 配置和验证 NTP

Packet Tracer - 配置和验证 NTP 地址分配表 设备 接口 IP 地址 子网掩码 N1 NIC 209.165.200.225 255.255.255.0 R1 G0/0 209.165.200.226 255.255.255.0 R2 G0/0 209.165.200.227 255.255.255.0 目标 在本练习中,您将在 R1 和 R2 中配置 NTP 以…

苍穹外卖day07——缓存菜品套餐+购物车功能实现

缓存菜品——需求设计与分析 问题说明 用户访问量过大带来的一个直接效果就是响应速度慢,使用体验下降。 实现思路 使用redis缓存菜品数据,减少数据库查询操作。 页面展示上基本就是同一个分类在同一页,所以key-value结构可以使用不同的分…

【SQL应知应会】表分区(二)• Oracle版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分区表 • Oracle版 前言一、分区表1.什么是表分区…

富文本编辑器wangEditor初探

1、前言 现有的Quill比较简单,无法满足业务需求(例如SEO的图片属性编辑需求) Quill已经有比较长的时间没有更新了,虽然很灵活,但是官方demo都没有一个。 业务前期也没有这块的需求,也没有考虑到这块的扩展…

如何提高代码效率——时间复杂度与空间复杂度——【C语言】

当我们面对一个问题时,会有许多种解题思路。我们现在的计算机技术已经达到非常先进的地步,所以当我们用不同的方法对待问题时,时间差异不会很明显,内存差异我们一般在平常小问题时感受不到,所以我们不会去纠结程序的优…

基于ssm+mysql+html道路养护管理系统

基于ssmmysqlhtml道路养护管理系统 一、系统介绍二、功能展示1.道路信息管理2.损害类型信息管理3.损害类型信息管理4.评定等级信息管理5.日常巡查信息管理6.定期检查信息管理 四、获取源码 一、系统介绍 系统主要功能:道路信息管理、损害类型信息管理、评定等级信息…

VSCode SSH远程连接与删除

1.ubuntu设置 安装SSH服务并获取远程访问的IP地址 在Ubuntu系统中,“CtrlAltT”打开终端工具,执行如下命令安装SSH服务。 sudo apt-get install openssh-server如果安装失败则先安装依赖项。 2.VS Code 设置 2.1安装与设置Remote SSH 打开Windows系…

今天,我被二维码卷到了...

# 关注并星标腾讯云开发者# 每周4 | 鹅厂一线程序员,为你“试毒”新技术# 第1期 | 腾讯王锐:测评二维码艺术画生成体验 都说AI绘画来势汹汹,但论创意,还是人类玩得花🤫。下面这几张乍一看平平无奇、却在网上疯传的AI生…

rcu链表综合实践

基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员,要先学会使用,再探究其内部原理。 链表的数据结构: struct list_head {struct list_head *next, *prev; };还有一种:struct h…

自建纯内网iot平台服务,软硬件服务器全栈实践

基于以下几个考虑,自制硬件设备,mqtt内网服务器。 1.米家app不稳定,逻辑在云端或xiaomi中枢网关只支持少部分在本地计算。 2.监控homeassistant官方服务有大量数据交互。可能与hass安装小米账户有关。 3.硬件:原理图,l…

apifox 调用camunda engine-rest接口报错“type“: “NotFoundException“

官方文档在这: https://docs.camunda.org/rest/camunda-bpm-platform/7.19/ 现象 engine-rest本是可以直接请求的,我把openapi导入到apifox之中了,我测试一下接口没有能请求成功的,基本都报以下的错。 报错如下 {"type&qu…

【iOS】Frame与Bounds的区别详解

iOS的坐标系 iOS特有的坐标是,是在iOS坐标系的左上角为坐标原点,往右为X正方向,向下为Y正方向。 bounds和frame都是属于CGRect类型的结构体,系统的定义如下,包含一个CGPoint(起点)和一个CGSiz…

《向量数据库指南》:向量数据库Pinecone如何集成Haystack库

目录 安装Haystack库 初始化PineconeDocumentStore 数据准备 初始化检索器 检查文档和嵌入 初始化提取式问答管道 提问 在这个指南中,我们将看到如何集成Pinecone和流行的Haystack库进行问答。 安装Haystack库 我们首先安装最新版本的Haystack,其中包括PineconeDocum…