### 背景
随着贝壳的业务功能的不断扩大,具有复杂功能的单体应用随之进入了微服务开发的迭代模式。项目需要作业调度模块是个常见需求,在之前单体系统中,集成了Quartz完成作业调度模块,因为单体应用集成一次后,单从技术层面看几乎没有新的工作量,而且整体还是比较稳定的,但是当单体应用进行微服务拆分后,很多微服务项目都需要集成作业调度模块,常规的一些作业调度实现,已经无法满足公司级的微服务项目扩张,一种轻量级、分布式、统一管理的作业调度框架势在必行。
![cache redis](https://raw.githubusercontent.com/zhaoyuguang/test/master/chaifen0.png)
### 需求
#### 从公司角度的需求
由于单体应用改为微服务项目,微服务项目的作业调度功能百花齐放,作业调度系统在整体项目体系中属于底层基础组件项目,整体需易于接入公司的监控和规范,原理需完全掌握,如任务执行出现问题,要有及时的报警以便及时跟进,并有定期日报汇总以便于掌握整体微服务系统作业的调度情况。作业调度原理要100%的掌握,不允许线上出现技术原理不清而阻塞故障的修复。当接入作业越来越多时,要有负载机制,监控整体系统运行状态。
#### 从业务系统角度的需求
作业调度系统要非常易于接入,且接入问题需要有专项小组提供解决方案,不能阻塞业务系统开发,作业需要灵活配置,且调度要准确。而且用户手册要足够强大,作业调度专项小组在必要的情况下要持续支援有些快速开发的业务项目,因为这种突击项目着重关心业务实现,根本不关心基础组件实现细节,更不想遇到组件使用的阻塞。即:投入低,回报高。
### 技术调研
在github上调研了目前比较流行作业调度项目,其大致可以分为一下几个形态:
#### 深度优化定制Quartz形态
深度了解学习改造Quartz源码,将Quartz使用DB迁移至使用Zookeeper,通过开发后端管理系统操作Zookeeper,从而来管理整个作业调度任务的配置,这种形态的作业调度,原理上作业调度实现还是在客户端完成,管理系统很弱化。这样的作业调度系统有个与生俱来的优势是:在管理系统出现故障时候也不会影响作业的继续作业。因为客户端项目几乎集成全量的作业调度代码实现。
![cache redis](https://raw.githubusercontent.com/zhaoyuguang/test/master/xingtai2.png)
#### Quartz服务端形态
将Quartz抽象并封装成服务端,客户端通过基础client-refence.jar完成任务的 hook method 暴露,服务端完成作业配置任务,当作业有任务触发时,通过一种协议触发客户端项目任务的勾子方法,完成调度。这种形态的作业调度框架,客户端一定程度减少了作业调度代码量,和项目性能消耗,但是带来了很多分布式调度问题,需要深入了解整体调度的实现。
![cache redis](https://raw.githubusercontent.com/zhaoyuguang/test/master/xingtai1.png)
#### 自实现调度系统
这种形态的作业调度系统基本都是功能非常多的,功能自实现一部分,也可通过SPI集成一部分,比如调度可以用Quartz实现,或是框架自身通过解析语法如:CronExpression实现Cron作业解析出未来一定时间内的任务,当时间到达触发时间。触发可支持客户端集成,或通过一种协议触发客户端项目任务来完成调度。学习这类形态的作业调度架构,可以发人深省,无论从广度或者深度,都可以使学习者对作业调度架构的认识更上一层楼。
### 思考与实践
通过对作业系统的背景需求的认识,和在github进行的技术调研学习,结合我们自身特点,在实现自己的作业调度过程中,我们思考了如下几点:
#### 调度设计与实现
客户端暴露任务,通过注册发现将任务与服务端数据同步,在服务端将发现到的任务自定义的组装成作业,完成整体作业调度功能。服务端集成公司监控和规范。
#### 整体架构设计
![cache redis](https://raw.githubusercontent.com/zhaoyuguang/test/master/fm.png)
#### 作业调度原理实现
![cache redis](https://raw.githubusercontent.com/zhaoyuguang/test/master/liuchengtu.png)
#### 作业调度服务端高可用的实现方案
服务端通过Zookeeper主备选举,完成服务端自身高可用实现,另外服务端暴露出健康接口,这里我们公司有对服务健康接口的持续监测,如果集群中,某个健康接口出现异常,会立刻报警给值班人员。
#### 作业调度服务端实现
这里我们调研了第三种形态中的功能实现,通过对调度底层实现的学习,我们实现了任务在服务端的可配置作业。
#### 如何做到客户端极简实现
作业调度需求项目通过集成client-refence.jar将任务方法暴露到注册中心,并内部实现任务触发方法,以便完成任务调度的触发。其原理是利用反射机制,通过在方法上增加特定注解,识别出此注解方法为任务方法。
#### 任务方法的注册发现
前面说了客户端的极简实现,客户端注册任务到注册中心上面,且通过心跳完成本地暴露任务与注册中心的任务持续的一致性。
#### 项目权限设计
随之客户端项目越来越多的接入作业平台,肯定是需要一种权限体系完成客户端接入项目的逻辑隔离,这里我们参考git项目人员管理体系,项目名称为唯一标识,创建项目的同学为此项目的owner,可根据系统号邀请其他同学加入此项目,共同维护此项目作业配置。
#### 异常报警实现
定义异常事件类型和内容,如:任务失败事件,内容是异常信息等,通过观察者模式结合项目人员完成异常事件的实时报警。结合上面的权限成员,立刻发送给任务所在项目组成员。
#### 依赖、分片任务的实现
这里我们参考了一些国外的科研项目,结合业内比较流行的设计,通过用有序无环图(DAG)来实现任务的串联依赖,与任务的平级分片。
### 产品特点
1. 客户端任务动态注册发现
2. 任务动态配置成作业
3. 任务执行负载均衡策略
### 前置依赖
```
1. Mysql
2. Zookeeper
3. Java
4. Maven
```
### 代码模块简介
```
1. kob-server-console 作业管理平台。
2. kob-server-core 作业管理底层代码实现模块,以jar包引入方式被kob-server-console、kob-server-processor依赖。
3. kob-server-processor 作业调度执行器。
4. kob-basic 服务端( kob-server-* )、客户端( kob-client-* )公用jar包。
5. kob-client-demo-spring-boot 客户端springboot的一种接入形式。
6. kob-client-parent 作业调度客户端项目依赖jar包。
kob-client-spring 客户端spring项目依赖jar,会被kob-client-spring-boot-starter依赖。
kob-client-spring-boot-starter 客户端spring-boot项目依赖jar。
7. table.sql 以集群名称是incubating,生成的sql文件
```
### 快速开始
#### Maven install
```java
mvn clean install -DskipTests
```
#### pom依赖
```java
<dependency>
<groupId>com.ke</groupId>
<artifactId>kob-client-spring-boot-starter</artifactId>
</dependency>
```
#### 创建项目
![cache redis](https://raw.githubusercontent.com/zhaoyuguang/test/master/project_access.png)
#### Client配置文件
```java
kob.client:
zp: incubator
project_code: kob_monitor
Zookeeper_servers: localhost:2801
admin_url: http://localhost:8668
```
#### Client编写任务
```java
@Task(key = "hello", remark = "你好")
public TaskResult helloWorld(TaskBaseContext context){
System.out.println(JSON.toJSONString(context));
return TaskResult.success(
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了代码和底层硬件之间的中介。 面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
资源推荐
资源详情
资源评论
收起资源包目录
中心化的作业调度系统,定义了任务调度模型,实现了任务调度的统一管理和监控。.zip (218个子文件)
bootstrap.min.css 118KB
animate.min.css 52KB
font-awesome.css 34KB
font-awesome.min.css 28KB
sweetalert2.min.css 26KB
bootstrap-datetimepicker.css 12KB
sb-admin-2.css 8KB
bootstrap-select.css 8KB
footable.bootstrap.min.css 8KB
bootstrap-table.css 7KB
sb-admin-2.min.css 7KB
awesome-bootstrap-checkbox.css 7KB
bootstrap-select.min.css 6KB
footable.standalone.css 6KB
footable.core.css 5KB
footable.metro.css 4KB
metisMenu.min.css 781B
kob.css 613B
morris.css 433B
Dockerfile 1KB
Dockerfile 1KB
fontawesome-webfont.eot 75KB
fontawesome-webfont.eot 37KB
glyphicons-halflings-regular.eot 20KB
footable.eot 5KB
spring.factories 127B
index_bak.ftl 42KB
main_bak.ftl 27KB
job_init.ftl 11KB
job_cron.ftl 10KB
task_record.ftl 8KB
welcome.ftl 7KB
project_user.ftl 7KB
task_waiting.ftl 6KB
client_node.ftl 5KB
log_collect.ftl 4KB
person_config.ftl 4KB
project_access.ftl 3KB
log_opt.ftl 3KB
server_node.ftl 3KB
header.ftl 3KB
left.ftl 3KB
login.ftl 2KB
topbar.ftl 2KB
index.ftl 470B
.gitignore 288B
favicon.ico 18KB
ISSUE_TEMPLATE 458B
CronExpression.java 59KB
ScheduleServiceImpl.java 23KB
ScheduleController.java 16KB
ManagerController.java 9KB
ClientLogConstant.java 8KB
LoggerController.java 7KB
TaskWaitingMapper.java 7KB
JobCronMapper.java 6KB
TaskRecordMapper.java 6KB
ClientContext.java 5KB
IndexController.java 5KB
ProjectUserMapper.java 4KB
NodeServiceImpl.java 4KB
WaitingTask.java 4KB
ClientProcessor.java 3KB
TaskDispatcher.java 3KB
ExpireTask.java 3KB
IpUtils.java 3KB
ProcessorProperties.java 3KB
TaskContext.java 3KB
ClientFunction.java 3KB
NodeController.java 3KB
TaskRecord.java 3KB
LogCollectMapper.java 3KB
OperationFilter.java 3KB
QWAlarmServiceImpl.java 3KB
KobUtils.java 3KB
CornJob.java 3KB
CollectServiceImpl.java 2KB
LoggerServiceImpl.java 2KB
ScheduleService.java 2KB
ClientProperties.java 2KB
LoggerService.java 2KB
LoggerBuilder.java 2KB
IndexServiceImpl.java 2KB
LockConsumer.java 2KB
UserMapper.java 2KB
LogOptMapper.java 2KB
CollectController.java 2KB
Heartbeat.java 2KB
ProjectUser.java 2KB
ResponseData.java 2KB
ManagerServiceImpl.java 2KB
NodeHashLoadBalance.java 2KB
OkHttpLogger.java 2KB
TaskRecordStateConstant.java 1KB
TaskWaiting.java 1KB
User.java 1KB
CuratorConfiguration.java 1KB
IndexService.java 1KB
FtlPath.java 1KB
ZkPathConstant.java 1KB
共 218 条
- 1
- 2
- 3
资源评论
JJJ69
- 粉丝: 6343
- 资源: 5918
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2023-04-06-项目笔记 - 第三百零八阶段 - 4.4.2.306全局变量的作用域-306 -2025.11.05
- Carla 0.9.15编译的zlib-1.2.13.zip
- Carla 0.9.15编译的xerces-c-3.23-src
- 【完整源码+数据库】基于Spring SchedulingConfigurer 实现动态定时任务
- Java Web应用集成支付宝支付功能【附完整源码及数据库设计】
- mysql驱动文件mysql
- python网络编程入门基础
- 基于SpringBoot 整合 AOP完整源码示例
- python基础,python进程和线程
- Java Web 实验项目 初步实现maven和idea的整合
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功