Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/shigebeyond/jkjob
https://github.com/shigebeyond/jkjob
Last synced: about 4 hours ago
JSON representation
- Host: GitHub
- URL: https://github.com/shigebeyond/jkjob
- Owner: shigebeyond
- Created: 2021-05-10T07:18:20.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2023-08-15T05:58:52.000Z (over 1 year ago)
- Last Synced: 2023-08-15T06:45:50.607Z (over 1 year ago)
- Language: Java
- Size: 116 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
[GitHub](https://github.com/shigebeyond/jkjob) | [Gitee](https://gitee.com/shigebeyond/jkjob)
# 概述
jkjob 是一个轻量级分布式作业调度平台,核心的设计理念是简单、轻量、易扩展、高性能。## 特性
- 1、简单, 易用, 轻量, 易扩展;
- 2、动态:支持动态修改作业状态、启动/停止作业,以及终止运行中作业,即时生效;
- 3、调度者: 同一时间内只有一个调度者, 但是集群模式下有热备, 可保证调度者HA;
- 4、作业执行: 作业执行支持lpc与rpc模式, rpc模式下就是分布式执行,支持集群处理,支持故障转移, 可保证作业执行HA;
- 5、故障转移:依赖于rpc框架的的故障转移, 作业在一台机器上执行失败了, 就切换到另外一台机器上执行。
- 6、动态分片:分片广播作业以执行者为维度进行分片,支持动态扩容执行者集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升作业处理能力和速度。
- 7、全异步:作业调度异步化,依靠异步rpc, 保证高效处理海量作业; 作业执行异步化, 依靠多线程执行, 提高作业执行效率;
## 背景
Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但存在以下问题:
1. API设计有点啰嗦, 使用麻烦
2. quartz底层以“抢占式”获取DB锁并由抢占成功的节点来执行作业,会导致节点负载悬殊非常大, 同时由抢占失败导致节点空转;而jkjob通过调度者主动分配作业给执行者,从而充分发挥集群优势,达到各节点负载均衡。因此, 本人依赖于jksoa-rpc实现一个更轻量更简单更高效的分布式作业调度系统
# 快速入门
jkjob的核心组件有2个:
1. Job - 作业, 代表作业执行
2. Trigger - 触发器, 负责定时触发作业执行, 可添加/删除job, 代表作业调度## 添加依赖
1. gradle
```
compile "net.jkcode:jkjob:1.9.0"
```2. maven
```net.jkcode
jkjob
1.9.0```
## 分别定义 job 与 trigger
```
import net.jkcode.jksoa.common.RpcRequest
import net.jkcode.jkjob.job.remote.RpcJob
import net.jkcode.jkjob.trigger.CronTrigger// 定义job
val req = RpcRequest(ISimpleService::sayHi, arrayOf("测试消息"))
val job = InvocationJob(req)
// 定义trigger
val trigger = CronTrigger("0/3 * * * * ?")
// 给trigger添加要触发的job
trigger.addJob(job)
// 启动trigger, 开始定时触发作业
trigger.start()
```## 使用 `DefaultScheduler` 简化代码
使用`net.jkcode.jkjob.schedulers.DefaultScheduler`, 配合cron与作业的复合表达式, 只需要两行代码便可定义定时作业
实际上`DefaultScheduler`是从cron与作业的复合表达式中, 分别解析出 `CronTrigger` 与 `RpcJob`, 效果与上一节是一样的
```
import net.jkcode.jkjob.schedulers.DefaultScheduler// cron与作业的复合表达式, 由cron表达式 + 作业表达式组成, 其中作业表达式前面加`:`, 标识触发的内容是作业
// 如 "0/10 * * * * ? -> lpc net.jkcode.jksoa.rpc.example.SimpleService hostname() ()"
//val cronJobExpr = "0/10 * * * * ? -> lpc net.jkcode.jkjob.LocalBean sayHi(String) (\\\"测试消息\\\")"
val cronJobExpr = "0/10 * * * * ? -> rpc net.jkcode.jksoa.rpc.example.ISimpleService sayHi(String) (\"测试消息\")"
val scheduler = DefaultScheduler()
val trigger = scheduler.addJob(cronJobExpr)
scheduler.start()
```# 文档
# jkjob
分布式任务调度的组件
## 入门
1. [作业](doc/job.md)
2. [触发器](doc/trigger.md)## 高级
3. [架构](doc/architecture.md)
4. [分片策略](doc/sharding_strategy.md)
5. [调度者集群](doc/cluster.md)