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

.net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost

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=truespring.security.user.name=frostspring.security.user.password=frost# 报警通知发送邮件spring.mail.host=smtp.mail.comspring.mail.username=spring.mail.password=# 邮件通知frost.notifier.mail.enabled=truefrost.notifier.mail.from=${spring.mail.username}frost.notifier.mail.to=frost.notifier.mail.subject=#{job.name} (#{job.id}) throws an exceptionfrost.notifier.mail.text=#{job.name} (#{job.id})  #{event.message}# 钉钉通知frost.notifier.dingtalk.enabled=falsefrost.notifier.dingtalk.subject=There is something wrong with #{job.name} (#{job.id})frost.notifier.dingtalk.text=#{job.name} (#{job.id})  #{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=50redisson.masterConnectionPoolSize=50redisson.timeout=3000# 单机模式redisson.address=redis://localhost:6379# 集群模式redisson.nodeAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381redisson.scanInterval=2000# 云托管模式redisson.nodeAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381redisson.scanInterval=2000redisson.dnsMonitoringInterval=5000# 哨兵模式redisson.sentinelAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381redisson.scanInterval=2000redisson.masterName=mymaster# 主从模式redisson.masterAddress=redis://127.0.0.1:6379redisson.slaveAddresses=redis://localhost:6380,redis://localhost:6381redisson.dnsMonitoringInterval=5000

2.部署项目

正确进行上述配置,可将项目编译打包 mvn package(jar或war,相关打包操作参照Spring boot),调度中心访问地址:http://localhost:20000/center,访问可进入登录界面

22402fe1e2a1376f30b3949560920f59.png

登录成功后进入报表页面

f93b972d97865c35bb8884540810d33a.png

3.集群模式

支持集群模式部署,提供调度系统可用性。

集群模式需要注意:保持 登录账号保持一致,保持使用redis配置相同。建议使用Nginx为调度中心做负载均衡

配置部署执行器

提供的frost-executor项目可直接使用,也可集成到现有业务项目中使用

1.依赖jar

在执行器项目中依赖如下jar包

vip.justlivefrost-core

2.配置说明

# 每个job支持并行处理数frost.job.parallel=2# 执行器名称frost.job.executor.name=${spring.application.name}# 执行器Keyfrost.job.executor.key=executor-demofrost.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=50redisson.masterConnectionPoolSize=50redisson.timeout=3000# 单机模式redisson.address=redis://localhost:6379# 集群模式redisson.nodeAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381redisson.scanInterval=2000# 云托管模式redisson.nodeAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381redisson.scanInterval=2000redisson.dnsMonitoringInterval=5000# 哨兵模式redisson.sentinelAddresses=redis://localhost:6379,redis://localhost:6380,redis://localhost:6381redisson.scanInterval=2000redisson.masterName=mymaster# 主从模式redisson.masterAddress=redis://127.0.0.1:6379redisson.slaveAddresses=redis://localhost:6380,redis://localhost:6381redisson.dnsMonitoringInterval=5000

3.部署执行器

执行 JobConfig.initExecutor() 进行初始化执行器,项目打包按照集成项目打包方式即可,部署后打开调度中心页面查看执行器页面

f6ad13e675050fe14a9529cb7b896c21.png

列表中出现部署的执行器则说明部署成功

开发一个简单的任务

该案例使用脚本任务模式,比使用实例模式只需要部署调度中心和执行器即可,脚本任务可在调度中心在线维护

1.新增任务

登录调度中心,在任务管理界面点击新增任务,任务类型选择脚本模式,输入相应参数,点击保存。

645653b801fc1cb7f8c95079e93cc4a9.png
7b832e37f34657bc86a16a5e6c3de912.png

2.脚本模式开发

在任务管理列表的操作栏,点击刚新建任务的脚本按钮,进入脚本脚本编辑页面。系统已经初始化了示例脚本任务,可按需进行修改。

38bd1dc8009803ede907feb8922939c6.png

3.触发执行

点击任务右侧“触发一次”按钮可触发一次任务(通常是配置cron定时触发)

4.查看结果

进入调度记录页面可查看调度和执行结果

1e06556f6cee3ab9682dc8bf205b6a48.png

任务配置属性说明

任务类型:脚本模式:传统的任务模式,需要在执行器开发对应的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

相关文章:

  • vba ado 连接mysql_Excel VBA 自定义类(ADO)连接数据库
  • python的核心数据类型_Python核心数据类型-字典
  • 加权平均数的例子_加权平均值和算术平均值的区别与公式
  • 爬虫用python写js代码_使用PyV8在Python爬虫中执行js代码
  • debezium mysql_几篇关于MySQL数据同步到Elasticsearch的文章---第一篇:Debezium实现Mysql到Elasticsearch高效实时同步...
  • mysql 字符串特殊字符_在MySQL中从具有字符串值(字符串,数字和特殊字符)的列中获取特定记录...
  • mysql多实例 window_window系统mysql多实例创建的方法
  • python 实例方法看到实例变量_python中的实例方法、静态方法、类方法、类变量和实例变量浅析...
  • mysql 查询主键 删除数据库_SQL删除数据库中所有用户数据表主键
  • mysql data free 很大_为什么MySQL的data_free大于数据和索引的组合?
  • 大学计算机基础python题库操作题_用Python玩转数据_中国大学 MOOC_题库2020
  • 查看mysql消耗的内存_nginx/mysql查看内存占用
  • java模板方法模式_设计模式之模板方法模式(java代码实现)
  • java package name_Java Package getName()用法及代码示例
  • java pojo 转 map_如何将POJO对象转换成MAP
  • Android优雅地处理按钮重复点击
  • const let
  • mysql外键的使用
  • node-glob通配符
  • node学习系列之简单文件上传
  • SQLServer之创建数据库快照
  • Vue全家桶实现一个Web App
  • 阿里云应用高可用服务公测发布
  • 高程读书笔记 第六章 面向对象程序设计
  • 搞机器学习要哪些技能
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 山寨一个 Promise
  • 微信公众号开发小记——5.python微信红包
  • 线上 python http server profile 实践
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)JPA - JQPL 实现增删改查
  • (转)关于pipe()的详细解析
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 表达式计算:Expression Evaluator
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .sh 的运行
  • @Validated和@Valid校验参数区别
  • [Django ]Django 的数据库操作
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [JavaEE系列] wait(等待) 和 notify(唤醒)
  • [java面试]宇信易诚 广州分公司 java笔试题目回忆录
  • [LeetCode] 148. Sort List 链表排序
  • [MFC] MFC 获取指定窗口截图(大小可调)
  • [Shell]Linux常用快捷键
  • [Silverlight 4 RC]RichTextBox概览