基于 Redis 的分布式任务调度框架 earth-frost
ccwgpt 2024-10-12 02:50 21 浏览 0 评论
earth-frost
earth-frost是一个轻量级分布式任务调度框架。
介绍
- 调度模块和执行模块分离
- 使用redis作为数据库
- 基于订阅模式实现服务注册和发现
- 演示地址: http://www.justlive.vip (请勿恶意攻击)
环境
- Angular: v1.x
- JDK: 1.8+
- Maven: 3+
- Redis: 2.8+
- Spring boot: 2.x
- Thymeleaf: 3
功能
1.0.0
- 简单易上手,支持web界面进行任务的CRUD
- 支持动态修改任务的开始,停止
- 调度中心支持集群部署,将任务的调度进行封装,支持分配各种不同的任务
- 执行器支持分布式,支持集群部署,可进行相应分组,在调度中心界面查看
- 支持伸缩扩展,调度中心和执行器都是基于redis订阅模式进行服务注册发现和任务调度,服务上下线发现及时
- 支持失败重试
- 任务监控和报警
- 动态编译任务,支持web界面编辑任务源码,创建任务
- 支持父子任务
- 运行报表
1.1.0
- 支持钉钉预警通知
- 调度记录增加执行时间
- 任务超时报警机制
- 支持分片任务
- 支持SimpleTrigger任务
- 支持非spring项目开发执行器
- misfire
1.2.0
- 修复分片父子任务执行多次问题
- 增加配置最大日志数
- 增加Spring项目执行案例
开发
frost-api 对外实体和接口 frost-core 定义调度、执行、注册发现等核心功能的接口和实现 frost-center 调度中心服务,包含安全认证和UI展示,依赖core实现调度逻辑 frost-executor 执行器服务,依赖core实现任务执行逻辑,包含开发脚本任务的部分实例以及配置样例 frost-client 客户端api,第三方项目可依赖client实现与调度中心交互
快速入门
启动Redis数据库
请下载并安装2.8+版本的Redis,单机或集群模式皆可。
调度中心和执行器均支持集群模式部署,集群模式下各节点需配置相同的Redis服务
导入源码
解压源码,按maven格式将源码导入IDE,源码结构如上述 [开发] 章节。
配置部署调度中心
1.配置内容说明
# 登录账号 spring.boot.auth.enabled=true spring.security.user.name=frost spring.security.user.password=frost # 报警通知发送邮件 spring.mail.host=smtp.mail.com spring.mail.username= spring.mail.password= # 邮件通知 frost.notifier.mail.enabled=true frost.notifier.mail.from=${spring.mail.username} frost.notifier.mail.to= frost.notifier.mail.subject=#{job.name} (#{job.id}) throws an exception frost.notifier.mail.text=#{job.name} (#{job.id}) \n #{event.message} # 钉钉通知 frost.notifier.dingtalk.enabled=false frost.notifier.dingtalk.subject=There is something wrong with #{job.name} (#{job.id}) frost.notifier.dingtalk.text=#{job.name} (#{job.id}) \n #{event.message} frost.notifier.dingtalk.accessToken= frost.notifier.dingtalk.linkUrl=localhost:20000/center # redis配置 # 0:单机模式, 1:集群模式,2:云托管模式,3:哨兵模式,4:主从模式 redisson.mode=0 # 公共配置 redisson.password= redisson.slaveConnectionPoolSize=50 redisson.masterConnectionPoolSize=50 redisson.timeout=3000 # 单机模式 redisson.address=redis://localhost:6379 # 集群模式 redisson.nodeAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381 redisson.scanInterval=2000 # 云托管模式 redisson.nodeAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381 redisson.scanInterval=2000 redisson.dnsMonitoringInterval=5000 # 哨兵模式 redisson.sentinelAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381 redisson.scanInterval=2000 redisson.masterName=mymaster # 主从模式 redisson.masterAddress=redis://127.0.0.1:6379 redisson.slaveAddresses=redis://localhost:6380,redis://localhost:6381 redisson.dnsMonitoringInterval=5000
2.部署项目
正确进行上述配置,可将项目编译打包 mvn package(jar或war,相关打包操作参照Spring boot),调度中心访问地址:http://localhost:20000/center,访问可进入登录界面
登录成功后进入报表页面
3.集群模式
支持集群模式部署,提供调度系统可用性。
集群模式需要注意:保持 登录账号保持一致,保持使用redis配置相同。建议使用Nginx为调度中心做负载均衡
配置部署执行器
提供的frost-executor项目可直接使用,也可集成到现有业务项目中使用
1.依赖jar
在执行器项目中依赖如下jar包
<dependency> <groupId>vip.justlive</groupId> <artifactId>frost-core</artifactId> </dependency>
2.配置说明
# 每个job支持并行处理数 frost.job.parallel=2 # 执行器名称 frost.job.executor.name=${spring.application.name} # 执行器Key frost.job.executor.key=executor-demo frost.job.executor.ip= frost.job.executor.port=${server.port} # 是否支持执行脚本任务 frost.job.executor.scriptJobEnabled=true # 错过执行的阈值(毫秒) frost.job.executor.misfireThreshold=5000 # 每个job最大日志保留数 frost.job.executor.maxLogSize=-1 # redis配置 # 0:单机模式, 1:集群模式,2:云托管模式,3:哨兵模式,4:主从模式 redisson.mode=0 # 公共配置 redisson.password= redisson.slaveConnectionPoolSize=50 redisson.masterConnectionPoolSize=50 redisson.timeout=3000 # 单机模式 redisson.address=redis://localhost:6379 # 集群模式 redisson.nodeAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381 redisson.scanInterval=2000 # 云托管模式 redisson.nodeAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381 redisson.scanInterval=2000 redisson.dnsMonitoringInterval=5000 # 哨兵模式 redisson.sentinelAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381 redisson.scanInterval=2000 redisson.masterName=mymaster # 主从模式 redisson.masterAddress=redis://127.0.0.1:6379 redisson.slaveAddresses=redis://localhost:6380,redis://localhost:6381 redisson.dnsMonitoringInterval=5000
3.部署执行器
执行 JobConfig.initExecutor() 进行初始化执行器,项目打包按照集成项目打包方式即可,部署后打开调度中心页面查看执行器页面
列表中出现部署的执行器则说明部署成功
开发一个简单的任务
该案例使用脚本任务模式,比使用实例模式只需要部署调度中心和执行器即可,脚本任务可在调度中心在线维护
1.新增任务
登录调度中心,在任务管理界面点击新增任务,任务类型选择脚本模式,输入相应参数,点击保存。
2.脚本模式开发
在任务管理列表的操作栏,点击刚新建任务的脚本按钮,进入脚本脚本编辑页面。系统已经初始化了示例脚本任务,可按需进行修改。
3.触发执行
点击任务右侧“触发一次”按钮可触发一次任务(通常是配置cron定时触发)
4.查看结果
进入调度记录页面可查看调度和执行结果
任务配置属性说明
任务类型: 脚本模式:传统的任务模式,需要在执行器开发对应的Bean,此模式的任务只能调度分配到拥有该类的执行器上 脚本模式:任务以Java源码的形式保存在数据库中,调度中心可将任务分配到任何开启支持脚本模式的执行器上,可使用@Resource/@Autowired注入执行器里中的其他服务 任务名称:任务的名称,描述任务以便于管理 执行器:指定运行在哪个执行器分组 执行器逻辑:指定任务运行的bean 任务模式: cron任务:支持cron表达式的定时任务 简单任务:选择日期时间定时执行(当时间早于当前时间则立即执行) 延时任务:启动任务后,固定延时执行任务 cron:触发任务的表达式(cron任务模式) 执行时间:选择执行的时间,精确到分(为什么不支持到秒?1.没有必要,2.h5的datetime-local仅支持到分,懒得用日期插件了)(简单任务模式) 延时:启动后延时时间,执行间隔时间,单位秒(延时任务模式) 子任务:可在任务列表中选择已创建的任务,当本任务执行成功时,将会触发子任务的一次主动调度 参数:运行任务的参数,字符串格式,执行逻辑可通过JobContext::getParam获取参数 失败处理: 失败通知(默认):调度或执行失败后,触发通知,默认提供了邮件,可继承AbstractEventNotifier进行扩展 失败重试:调度或执行失败后,会主动再次调度或执行 通知邮件:调度中心配置了全局的默认推送邮件地址,每个任务可自定义添加通知邮件列表 超时预警:可填写任务的预期处理时间,超过时间还未执行完任务则进行预警 分片运行:勾选后任务分片运行,可填写分片总数,注意:分片任务需要任务逻辑支持分片方式,否则会重复执行 自动运行:勾选后创建任务即是运行状态
开发实例模式任务
任务需要在frost-executor项目中编码并部署
1.在执行器项目中开发执行逻辑
- 继承 BaseJob 抽象类,默认实现了init、destory、exception方法 - 实现 BaseJob 的 execute 方法,任务处理的主要逻辑 - 异常处理(可选)重写 BaseJob 接口 exception 方法,自定义异常处理,返回true时执行全局异常处理逻辑,返回false不执行全局异常处理逻辑 - 实例化job(使用new或者ioc容器,推荐使用@vip.justlive.oxygen.core.ioc.Bean实例化) - 注册到执行器,添加注解 @Job(value = "执行逻辑id", desc = "执行逻辑描述")
2.在调度中心,新建任务
参考上述任务配置属性说明,任务类型选择实例模式,执行器选择执行器配置中frost.job.executor.key的值,执行逻辑选择@Job注解定义的值
开发脚本模式任务
1.在调度中心,新建脚本任务
参考实例模式的新建任务,任务模式选择脚本模式
注意:需要有执行器frost.job.executor.scriptJobEnabled=true开启支持脚本任务执行
2.在调度中心,开发任务代码
点击指定任务的脚本按钮,前往在线编辑任务界面,支持对任务代码进行开发(可在IDE中编辑完毕,复制粘贴到编辑中),支持使用静态工具类获取执行器中其他Bean
注意:分布式执行器要获取执行器中的Bean要确认是否所有执行器都存在该Bean,可配合指定执行器的分组来限定执行脚本任务的执行器
开发分片任务
1.在执行器项目中开发执行逻辑
分片任务通过将一个任务同时分发给所有执行器(或指定分片数量),协同进行任务处理,当进行大数据量操作时可显著提高处理速度。
@Bean @Job(value = "shardingJob", desc = "分片job例子") public class ShardingJob extends BaseJob { @Override public void execute(JobContext ctx) { // 获取分片信息 JobSharding sharding = ctx.getSharding(); // 分片序号 int index = sharding.getIndex(); // 分片总数 int total = sharding.getTotal(); ... 业务逻辑 } }
2.在调度中心,新建任务
参考上述实例任务配置任务,勾选分片运行,可使用默认执行器个数用于支持动态扩容或指定分片总数
任务管理
1.执行器列表
点击执行器管理导航进入执行器列表,展示在线的执行器
列表字段说明
- 执行器分组: 通过配置文件中的frost.job.executor.key进行分组,注意:分组相同且@Job的value相同的IJob逻辑应该完全相同
- 名称:执行器应用的名称,便于区分和管理
- 信息:展开分组时展示该执行器下注册的任务列表,合并分组时展示分组下在线执行器数量
2.任务管理
2.1 新建任务
参考开发实例模式或脚本模式任务章节
2.2 执行一次任务
点击操作栏“执行一次”按钮可触发执行一次任务
2.3 暂停任务
点击操作栏“暂停”按钮可暂停正常任务,后续调度将不再执行
2.4 恢复任务
点击操作栏“恢复”按钮可恢复暂停任务
2.5 编辑任务
点击操作栏“编辑”按钮可编辑任务属性,参照任务配置属性进行修改
2.6 在线编辑脚本
点击操作栏“脚本”按钮跳转到在线编辑脚本页面,可进行脚本任务源码修改
2.7 跳转任务日志
点击操作栏“日志”按钮跳转到调度记录页面,只展示该任务的记录
2.8 删除任务
点击操作栏“删除”按钮删除任务
3.使用client
3.1 依赖frost-client
<dependency> <groupId>vip.justlive</groupId> <artifactId>frost-client</artifactId> </dependency>
3.2 配置frost连接地址
# 调度中心地址 frost.client.baseUrl=http://localhost:20000/center # 用户名 frost.client.username=frost # 密码 frost.client.password=frost
3.3 实例化client
FacadeProxy proxy = FacadeProxy.newProxy("classpath:frost.properties", "classpath:frost-override.properties"); JobApiFacade jobApiFacade = proxy.getJobApiFacade();
3.4 调用JobApiFacade进行操作
相关推荐
- 详解DNFSB2毒王的各种改动以及大概的加点框架
-
首先附上改动部分,然后逐项分析第一个,毒攻掌握技能意思是力量智力差距超过15%的话差距会被强行缩小到15%,差距不到15%则无效。举例:2000力量,1650智力,2000*0.85=1700,则智力...
- 通篇干货!纵观 PolarDB-X 并行计算框架
-
作者:玄弟七锋PolarDB-X面向HTAP的混合执行器一文详细说明了PolarDB-X执行器设计的初衷,其初衷一直是致力于为PolarDB-X注入并行计算的能力,兼顾TP和AP场景,逐渐...
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
-
梦晨发自凹非寺量子位|公众号QbitAI字节最新深度思考模型,在数学、代码等多项推理任务中超过DeepSeek-R1了?而且参数规模更小。同样是MoE架构,字节新模型Seed-Thinkin...
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
-
作者|赵骁勇阿里巴巴智能引擎事业部审校|刘侃,KittyRTP-LLM是阿里巴巴大模型预测团队开发的高性能LLM推理加速引擎。它在阿里巴巴集团内广泛应用,支撑着淘宝、天猫、高德、饿...
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
-
校园系统通常是为学校、学生和教职工提供便捷的数字化管理工具。综合性社交大学校园小程序源码:同城校园小程序-大学校园圈子创业分享,校园趣事,同校跑腿交友综合性论坛。小程序系统基于TP6+Uni-app...
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
-
婚恋交友系统-打造您的专属婚恋交友平台系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包...
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
-
COMET团队投稿量子位|公众号QbitAI字节对MoE模型训练成本再砍一刀,成本可节省40%!刚刚,豆包大模型团队在GitHub上开源了叫做COMET的MoE优化技术。COMET已应用于字节...
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
-
2025年2月19日,美国通用电气航空航天公司(隶属于通用电气公司)宣布,已经完成了“下一代自适应推进系统”(NGAP)计划下提供的XA102自适应变循环发动机的详细设计审查阶段。XA102是通用电气...
- tpxm-19双相钢材质(双相钢f60材质)
-
TPXM-19双相钢是一种特殊的钢材,其独特的化学成分、机械性能以及广泛的应用场景使其在各行业中占有独特的地位。以下是对TPXM-19双相钢的详细介绍。**化学成分**TPXM-19双相钢的主要化学成...
- thinkphp6里怎么给layui数据表格输送数据接口
-
layui官网已经下架了,但是产品还是可以使用。今天一个朋友问我怎么给layui数据表格发送数据接口,当然他是学前端的,后端不怎么懂,自学了tp框架问我怎么调用。其实官方文档上就有相应的数据格式,js...
- 完美可用的全媒体广告精准营销服务平台PHP源码
-
今天测试了一套php开发的企业网站展示平台,还是非常不错的,下面来给大家说一下这套系统。1、系统架构这是一套基于ThinkPHP框架开发的HTML5响应式全媒体广告精准营销服务平台PHP源码。现在基于...
- 一对一源码开发,九大方面完善基础架构
-
以往的直播大多数都是一对多进行直播社交,弊端在于不能满足到每个用户的需求,会降低软件的体验感。伴随着用户需求量的增加,一对一直播源码开始出现。一个完整的一对一直播流程即主播发起直播→观看进入房间观看→...
- Int J Biol Macromol .|交联酶聚集体在分级共价有机骨架上的固定化:用于卤代醇不对称合成的高稳定酶纳米反应器
-
大家好,今天推送的文章发表在InternationalJournalofBiologicalMacromolecules上的“Immobilizationofcross-linkeden...
- 【推荐】一款开源免费的 ChatGPT 聊天管理系统,支持PC、H5等多端
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍GPTCMS是一款开源且免费(基于GPL-3.0协议开源)的ChatGPT聊天管理系统,它基于先进的GPT...
- 高性能计算(HPC)分布式训练:训练框架、混合精度、计算图优化
-
在深度学习模型愈发庞大的今天,分布式训练、高效计算和资源优化已成为AI开发者的必修课。本文将从数据并行vs模型并行、主流训练框架(如PyTorchDDP、DeepSpeed)、混合精度训练(...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 详解DNFSB2毒王的各种改动以及大概的加点框架
- 通篇干货!纵观 PolarDB-X 并行计算框架
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
- tpxm-19双相钢材质(双相钢f60材质)
- thinkphp6里怎么给layui数据表格输送数据接口
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (52)
- java框架spring (43)
- grpc框架 (55)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)