beecomb是一个大规模、高可靠的任务调度系统,与传统定时任务调度系统不同的是beecomb特别适合大规模的延迟(delay)任务、调度(schedule)任务
beecomb适用场景有延时退款、抢票平台等面向N个有各自调度对象,或分批处理大批量数据、并行分片处理大数据的任务场景,也能作为传统定时任务调度系统。
系统架构角色分为
- Registry&Metrics 注册与度量中心
- Master 集群Master节点
- Worker 集群Worker节点
- Executor 任务执行器,可以与Application是相同应用
- Application 应用系统
- 大规模任务,beecomb集群部署水平扩容、数据水平切分、调度与执行器解耦等设计,大规模集群可支持千万级任务(活跃任务)
- 高可靠保障,数据持久化,集群实例故障时任务自动恢复
- 高精度时间,每个任务在什么时间执行是精确的
- 智能压力负载均衡,任务在集群中将根据调度引擎、执行器的cpu、内存、已分配的任务数量进行负载均衡
- 分片并行执行任务
- 多系统支持
- 可视化Web
- Java 17及以上
- Zookeeper(不低于3.6.0,推荐3.7.0及以上)
- Mysql 5.7(推荐8.0及以上)
下载压缩包 https://gitee.com/icodegarden/beecomb/releases
下面展示如何快速开始使用
创建2个database(beecomb使用shardingsphere分库),可以在相同mysql实例上
create DATABASE `beecomb_0`;
create DATABASE `beecomb_1`;
下载 scripts/mysql文件夹 ,在2个database中都执行初始化脚本 init.sql、mysql_sequence.sql
下载 beecomb-master-{version}.tar.gz 并解压,修改config/下的配置(zookeeper地址,mysql地址等),使用bin/startup.sh启动(windows用bin/startup.cmd)
bin/startup.sh
下载 beecomb-worker-{version}.tar.gz 并解压,修改config/下的配置(zookeeper地址,mysql地址等),使用bin/startup.sh启动(windows用bin/startup.cmd)
bin/startup.sh
下载 beecomb-executor-sample,下面是QuickStartJobHandler.java代码
public class QuickStartJobHandler implements JobHandler {
public static final String NAME = "QuickStartAppJobHandler";
@Override
public String name() {
return NAME;
}
@Override
public ExecuteJobResult handle(Job job) throws Exception {
System.out.println("handle job:" + job);
if (job instanceof DelayJob) {
int delay = ((DelayJob) job).getDelay();
System.out.println(delay);
}
return new ExecuteJobResult();// 执行成功
}
}
下载 beecomb-executor-sample,下面的代码在 QuickStartApp.java
ZooKeeper zookeeper = new ZooKeeper(zkConnectString);
ZooKeeperSupportInstanceProperties properties = new ZooKeeperSupportInstanceProperties(zookeeper);
BeeCombExecutor beeCombExecutor = BeeCombExecutor.start(EXECUTOR_NAME, properties);
List<JobHandler> jobHandlers = Arrays.asList(new QuickStartJobHandler());
beeCombExecutor.registerReplace(jobHandlers);
下载 beecomb-executor-sample,下面的代码在 QuickStartApp.java,在本例中Executor和Application是同一个应用
Authentication authentication = new BasicAuthentication("beecomb", "beecomb");//client认证方式
ZooKeeper zooKeeper = new ZooKeeper(zkConnectString);
ZooKeeperClientProperties clientProperties = new ZooKeeperClientProperties(authentication, zooKeeper);
BeeCombClient beeCombClient = new ZooKeeperBeeCombClient(clientProperties);
下载 beecomb-executor-sample,下面的代码在 QuickStartApp.java
/**
* 创建延迟任务,达到延迟后 {@link QuickStartAppJobHandler} 将触发任务执行
*/
Delay delay = new CreateDelayJobDTO.Delay(3000);
CreateDelayJobDTO job = new CreateDelayJobDTO("QuickStartDelayJob", EXECUTOR_NAME, QuickStartJobHandler.NAME,
delay);
CreateJobVO response = beeCombClient.createJob(job);
更多示例见 SampleApp.java,其中包含了经典的 红包自动退款场景,抢票场景,任务分片并行处理场景
访问 {master地址}:9898 默认用户密码beecomb/beecomb
任务的执行是在Executor中的JobHandler中进行的,每个Executor都可以有N个JobHandler,开发者需要做的就是编写JobHandler
首先引入maven依赖
<dependency>
<groupId>io.github.icodegarden</groupId>
<artifactId>beecomb-executor</artifactId>
<version>2.0.0</version>
</dependency>
编写JobHandler
public class QuickStartJobHandler implements JobHandler {
@Override
public String name() {
}
@Override
public ExecuteJobResult handle(Job job) throws Exception {
}
}
启动Executor并注册JobHandler
BeeCombExecutor beeCombExecutor = BeeCombExecutor.start(EXECUTOR_NAME, properties);
List<JobHandler> jobHandlers = Arrays.asList(new QuickStartJobHandler());
beeCombExecutor.registerReplace(jobHandlers);
可以看到JobHandler有name,BeeCombExecutor也有name,任务该由哪个Executor的哪个JobHandler处理,正是由name决定的,创建job时每个job都需要executorName和jobHandlerName
业务应用需要能够创建、查询任务,java语言可以直接使用Client SDK,非java语言可以使用restapi
首先引入maven依赖
<dependency>
<groupId>io.github.icodegarden</groupId>
<artifactId>beecomb-client-java</artifactId>
<version>最新版本可在maven中央仓库找到</version>
</dependency>
使用Client创建任务
BeeCombClient beeCombClient = new ZooKeeperBeeCombClient(clientProperties);
beeCombClient.createJob(...);
创建任务的详细参数见restapi介绍
restapi认证使用basic auth,即使用http header Authorization:base64(username:password)
接口地址 POST openapi/v1/jobs
path参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
async | boolean | N | 1 | 是否异步处理,默认true | true |
body参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
uuid | string | N | 0-64 | 任务的uuid,用户指定或自动生成 | j21ccde2334 |
name | string | Y | 1-30 | 任务名 | jname |
type | string | Y | 枚举Delay, Schedule | 任务类型 | Delay |
executorName | string | Y | 1-30 | 任务由哪个Executor执行 | e1 |
jobHandlerName | string | Y | 1-30 | 任务由哪个JobHandler执行 | j1 |
priority | int | N | 1-10 | 任务的优先级,默认5,仅在任务恢复时起作用 | 5 |
weight | int | N | 1-N | 任务的重量,默认1,该值对负载压力的计算起作用,例如Executor配置的overload.jobs.max是10000,则Executor能负载10000个重量是1、执行频率是1秒1次的任务,或负载4000个重量是5、执行频频率2秒1次的任务 | 1 |
parallel | boolean | N | 1 | 是否并行任务,默认false | false |
maxParallelShards | int | N | 2-64 | 最大并行分片数,默认8,当合格的Executor数大于等于该值时,按该值分片,小于时按实际Executor数分片 | 8 |
executeTimeout | int | N | 1000-3600000 | 任务执行超时毫秒,默认10000 | 10000 |
params | string | N | 65535 | 任务执行的参数 | id=100 |
desc | string | N | 200 | 任务描述 | 我的任务 |
delay | Delay | 当type是Delay时必须 | 1 | delay参数 | |
schedule | Schedule | 当type是Schedule时必须 | 1 | schedule参数 |
|Delay|
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
delay | int | Y | 1000-31536000000000 | 任务的延迟执行时间毫秒 | 60000 |
retryOnExecuteFailed | int | N | 0-N | 当任务执行失败时重试次数,默认0 | 3 |
retryBackoffOnExecuteFailed | int | N | 1000-N | 重试回退时间毫秒,默认3000 | 10000 |
retryOnNoQualified | int | N | 0-N | 当任务执行没有合格的Executor时重试次数,默认0 | 3 |
retryBackoffOnNoQualified | int | N | 5000-N | 重试回退时间毫秒,默认30000 | 30000 |
|Schedule|
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
scheduleFixRate | int | N | 1000-31536000000000 | 任务执行FixRate时间毫秒 | 60000 |
scheduleFixDelay | int | N | 1000-31536000000000 | 任务执行FixDelay时间毫秒 | 60000 |
sheduleCron | string | N | 符合cron | 任务cron | 0 0/2 * * * * |
scheduleFixRate、scheduleFixDelay、sheduleCron必选其一 |
响应参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
job | Job | Y | 1 | job的返回参数 | |
dispatchException | string | N | 0-N | dispatch失败时有 |
|Job|
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
id | long | Y | 1-N | 任务的唯一序列 | 1 |
uuid | string | N | 0-64 | 任务的uuid,如果创建时没有提供则自动生成 | j21ccde2334 |
name | string | Y | 1-30 | 任务名 | jname |
type | string | Y | 枚举Delay, Schedule | 任务类型 | Delay |
priority | int | N | 1-10 | 任务的优先级,默认5,仅在任务恢复时起作用 | 5 |
weight | int | N | 1-N | 任务的重量 | 1 |
queued | boolean | Y | 1 | 任务是否已队列 | true |
queuedAtInstance | string | N | 1-N | 任务已队列时对应的地址 | 145.23.12.3:19898 |
接口地址 GET openapi/v1/jobs/{id}
path参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
id | long | Y | 1-N | 任务id | 1 |
响应参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
id | long | Y | 1-N | 任务的唯一序列 | 1 |
uuid | string | N | 0-64 | 任务的uuid,如果创建时没有提供则自动生成 | j21ccde2334 |
name | string | Y | 1-30 | 任务名 | jname |
type | string | Y | 枚举Delay, Schedule | 任务类型 | Delay |
executorName | string | Y | 1-30 | 任务由哪个Executor执行 | e1 |
jobHandlerName | string | Y | 1-30 | 任务由哪个JobHandler执行 | j1 |
priority | int | N | 1-10 | 任务的优先级 | 5 |
weight | int | N | 1-N | 任务的重量 | 1 |
parallel | boolean | N | 1 | 是否并行任务,默认false | false |
maxParallelShards | int | N | 2-64 | 最大并行分片数 | 8 |
queued | boolean | Y | 1 | 任务是否已队列 | true |
queuedAt | string | N | yyyy-MM-dd HH:mm:ss格式 | 进队列时间 | 2021-05-01 12:12:12 |
queuedAtInstance | string | N | 1-N | 任务已队列时对应的地址 | 145.23.12.3:19898 |
lastTrigAt | string | N | yyyy-MM-dd HH:mm:ss格式 | 上次触发时间 | 2021-05-02 12:01:02 |
lastTrigResult | string | N | 0-200 | 上次触发结果 | |
lastExecuteExecutor | string | N | 0-N | 上次有哪个执行器执行 | 145.23.12.3:19898 |
lastExecuteReturns | string | N | 0-200 | 上次执行任务返回结果,这是你自己写的返回参数 | id=200 |
lastExecuteSuccess | boolean | Y | 1 | 上次执行是否成功 | true |
executeTimeout | int | N | 1000-3600000 | 任务执行超时毫秒 | 10000 |
nextTrigAt | string | N | yyyy-MM-dd HH:mm:ss格式 | 下次触发时间 | 2021-05-02 12:01:30 |
end | boolean | Y | 1 | 任务是否结束 | false |
createdBy | string | Y | 1-30 | 任务创建者 | beecomb |
createdAt | string | N | yyyy-MM-dd HH:mm:ss格式 | 任务创建时间 | 2021-05-02 12:12:12 |
params | string | N | 65535 | 任务执行的参数 | id=100 |
desc | string | N | 200 | 任务描述 | 我的任务 |
delay | Delay | 当type是Delay时 | 1 | delay参数 | |
schedule | Schedule | 当type是Schedule时 | 1 | schedule参数 |
|Delay|
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
delay | int | Y | 0-N | 任务的延迟执行时间毫秒 | 60000 |
retryOnExecuteFailed | int | N | 0-N | 当任务执行失败时重试次数,默认0 | 3 |
retryBackoffOnExecuteFailed | int | N | 1000-N | 重试回退时间毫秒,默认3000 | 10000 |
retriedTimesOnExecuteFailed | int | Y | 0-N | 已重试次数,默认0 | 2 |
retryOnNoQualified | int | N | 0-N | 当任务执行没有合格的Executor时重试次数,默认0 | 3 |
retryBackoffOnNoQualified | int | N | 5000-N | 重试回退时间毫秒,默认30000 | 30000 |
retriedTimesOnNoQualified | int | Y | 0-N | 已重试次数,默认0 | 2 |
|Schedule|
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
scheduleFixRate | int | N | 1-N | 任务执行FixRate时间毫秒 | 60000 |
scheduleFixDelay | int | N | 1-N | 任务执行FixDelay时间毫秒 | 60000 |
sheduleCron | string | N | 符合cron | 任务cron | 0 0/2 * * * * |
scheduledTimes | int | Y | 0-N | 已调度次数 | 2 |
scheduleFixRate、scheduleFixDelay、sheduleCron必选其一 |
接口地址 GET openapi/v1/jobs/uuid/{uuid}
path参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
uuid | string | Y | 1-N | 使用uuid查询任务 | j21ccde2334 |
响应参数,同 查询任务(id)
接口地址 GET openapi/v1/jobs
path参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
uuid | string | N | 1-N | 任务uuid | j21ccde2334 |
nameLike | string | N | 1-N | 任务名模糊,左匹配 | jname |
type | string | N | 枚举Delay, Schedule | 任务类型 | Delay |
parallel | boolean | N | 1 | 是否并行任务 | false |
lastExecuteSuccess | boolean | N | 1 | 上次执行是否成功 | true |
queued | boolean | N | 1 | 任务是否已队列 | true |
end | boolean | N | 1 | 任务是否结束 | false |
page | int | N | 1-N | 第几页,从1开始,默认1,最大1000 | 1 |
size | int | N | 1-N | 每页几条,默认10,最大100 | 10 |
响应header
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
X-Total-Pages | int | Y | 1-1000 | 总页数,最大1000 | 10 |
响应参数,是 查询任务(id) 的jsonarray格式
接口地址 PUT openapi/v1/jobs
body参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
id | long | Y | 1-N | 任务的唯一序列 | 1 |
name | string | N | 1-30 | 任务名 | jname |
executorName | string | N | 1-30 | 任务由哪个Executor执行 | e1 |
jobHandlerName | string | N | 1-30 | 任务由哪个JobHandler执行 | j1 |
priority | int | N | 1-10 | 任务的优先级 | 5 |
weight | int | N | 1-N | 任务的重量 | 1 |
maxParallelShards | int | N | 2-64 | 最大并行分片数 | 8 |
executeTimeout | int | N | 1000-3600000 | 任务执行超时毫秒,默认1000 | 1000 |
params | string | N | 65535 | 任务执行的参数 | id=100 |
desc | string | N | 200 | 任务描述 | 我的任务 |
delay | Delay | 当type是Delay时可选 | 1 | delay参数 | |
schedule | Schedule | 当type是Schedule时可选 | 1 | schedule参数 |
|Delay|
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
delay | int | Y | 1000-31536000000000 | 任务的延迟执行时间毫秒 | 60000 |
retryOnExecuteFailed | int | N | 0-N | 当任务执行失败时重试次数,默认0 | 3 |
retryBackoffOnExecuteFailed | int | N | 1000-N | 重试回退时间毫秒,默认3000 | 10000 |
retryOnNoQualified | int | N | 0-N | 当任务执行没有合格的Executor时重试次数,默认0 | 3 |
retryBackoffOnNoQualified | int | N | 5000-N | 重试回退时间毫秒,默认30000 | 30000 |
|Schedule|
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
scheduleFixRate | int | N | 1000-31536000000000 | 任务执行FixRate时间毫秒 | 60000 |
scheduleFixDelay | int | N | 1000-31536000000000 | 任务执行FixDelay时间毫秒 | 60000 |
sheduleCron | string | N | 符合cron | 任务cron | 0 0/2 * * * * |
scheduleFixRate、scheduleFixDelay、sheduleCron选其一 |
响应参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
id | long | Y | 1-N | 任务的唯一序列 | 1 |
success | boolean | Y | 1 | 是否成功;注意如果更新任务的执行时间,则从更新时间开始重新计时 | true |
接口地址 DELETE openapi/v1/jobs/{id}
path参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
id | long | Y | 1-N | 任务id | 1 |
响应参数
参数 | 类型 | 是否必填 | 长度 | 描述 | 示例值 |
---|---|---|---|---|---|
id | long | Y | 1-N | 任务的唯一序列 | 1 |
success | boolean | Y | 1 | 是否成功;注意对 已经完成 或 已经取消 的任务会失败 | true |
对于Zookeeper的依赖,只需有可用的环境,并没有数据需要初始化
对Mysql需要进行数据初始化,见 快速开始 的 初始化数据库 介绍,除此还需要配置config/下的application-shardingsphere-config.properties,master和worker保持一致,详细说明如下
beecomb使用shardingsphere分库,默认需要2个库(可以在相同的mysql实例),支持自定义多个库,下面先以2个库为例
# 配置真实数据源
## 配置第 1 个数据源
commons.shardingsphere.datasources[0].name=ds0
commons.shardingsphere.datasources[0].jdbc-url=jdbc:mysql://127.0.0.1:3306/beecomb_0?setUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
commons.shardingsphere.datasources[0].username=root
commons.shardingsphere.datasources[0].password=123456
#支持以下参数
#commons.shardingsphere.datasources[0].minimumIdle=
#commons.shardingsphere.datasources[0].idleTimeout=
#commons.shardingsphere.datasources[0].maximumPoolSize=
#commons.shardingsphere.datasources[0].maxLifetime=
#commons.shardingsphere.datasources[0].connectionTimeout=
#commons.shardingsphere.datasources[0].connectionTestQuery=
#commons.shardingsphere.datasources[0].keepaliveTime=
#commons.shardingsphere.datasources[0].validationTimeout=
## 配置第 2 个数据源
commons.shardingsphere.datasources[1].name=ds1
commons.shardingsphere.datasources[1].jdbc-url=jdbc:mysql://127.0.0.1:3306/beecomb_1?setUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
commons.shardingsphere.datasources[1].username=root
commons.shardingsphere.datasources[1].password=123456
# 分片算法
##algorithmName可以自定义但要与分片表的shardingAlgorithmName对应无需修改
##rangeGte=0表示该组库的id范围支持从0开始;rangeLt=20000000表示该组库的任务id范围支持到2000万结束
##mod=2表示该组任务id以2取模,因为2个库平均分摊,如果配置3表示以3取模,此时注意modLoadBalance要配置取模结果是2时存入哪个ds
##modLoadBalance={"ds0":[0],"ds1":[1]} 表示取模结果是多少分别存入哪个库
commons.shardingsphere.rangeModShardingAlgorithms[0].algorithmName=jobidrangemod
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[0].name=group0
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[0].rangeGte=0
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[0].rangeLt=20000000
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[0].mod=2
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[0].modLoadBalance={"ds0":[0],"ds1":[1]}
通过以上示例可以看出分多少库是可以自定义的,并且分片算法配置可以让数据 避免热点、避免迁移,下面展示当上面的几个库即将不够用时,继续增加2个库如何避免迁移
#基于上面的配置继续追加下面配置
# 配置第 3 个数据源
commons.shardingsphere.datasources[2].name=ds2
commons.shardingsphere.datasources[2].jdbc-url=jdbc:mysql://127.0.0.1:3306/beecomb_2?setUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
commons.shardingsphere.datasources[2].username=root
commons.shardingsphere.datasources[2].password=123456
# 配置第 4 个数据源
commons.shardingsphere.datasources[3].name=ds3
commons.shardingsphere.datasources[3].jdbc-url=jdbc:mysql://127.0.0.1:3306/beecomb_3?setUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
commons.shardingsphere.datasources[3].username=root
commons.shardingsphere.datasources[3].password=123456
# 分片算法配置
##增加新的group来支持更多的数据
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[1].name=group1 #新的组名称
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[1].rangeGte=20000000 #起始值跟跟上面的组衔接
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[1].rangeLt=50000000 #支持到5000万
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[1].mod=3 #该组任务id以3取模,尽管库是2个,但这里假设的是2个库的硬件不一样,其中1个的硬件是2倍能力,因此2倍的库可以承担2倍的数据
commons.shardingsphere.rangeModShardingAlgorithms[0].groups[1].modLoadBalance={"ds2":[0,1],"ds3":[2]} #取模结果是0和1的存到高性能的库,结果2的存到普通性能
通过以上示例可以看出数据库可以随着业务发展逐渐的增加,实现水平扩容
master是springboot项目,支持springboot方式参数配置
该方式参考启动master,日志默认位于目录的logs/下
docker镜像可以打开docker官方网站 https://hub.docker.com/search?q=beecomb 即可找到,pull镜像需指定version
docker pull icodegarden/beecomb-master:{version}
启动命令例如
docker run --name beecomb-master -d -p 9898:9898 -e JAVA_OPTS="..." -e JAVA_ARGS="..." icodegarden/beecomb-master:{version}
JAVA_OPTS可以把需要的JVM参数都给上去,JAVA_ARGS可以把zookeeper、mysql等配置给上去
worker是springboot项目,支持springboot方式参数配置
该方式参考启动worker,日志默认位于目录的logs/下
docker镜像可以打开docker官方网站 https://hub.docker.com/search?q=beecomb 即可找到,pull镜像需指定version
docker pull icodegarden/beecomb-worker:{version}
启动命令例如
docker run --name beecomb-worker -d -p 19898:19898 -e JAVA_OPTS="..." -e JAVA_ARGS="..." icodegarden/beecomb-worker:{version}
提示:如有网络需要,server.bindIp=xxx 可以帮助解决容器间的网络
除了 部署 中已涉及的参数,还支持更多参数,用于高级配置
参数 | 描述 | 默认值 | 配置范围 |
---|---|---|---|
server.port | matser的http端口 | 9898 | 按端口规则 |
server.bindIp | master的ip地址 | 网络地址 | 按ip规则 |
zookeeper.root | beecomb在zk中的root目录 | /beecomb | 任意独占目录 |
zookeeper.connectString | zk的地址,多个以,号分隔 | 无 | 必须 |
zookeeper.connectTimeout | zk的connectTimeout | 3000 | 按需 |
zookeeper.sessionTimeout | zk的sessionTimeout | 3000 | 按需 |
zookeeper.aclAuth | zk的Auth方式认证 | beecomb:beecomb | 按需 |
zookeeper.lockRoot | zk的分布式锁目录 | /beecomb-lock | 按需 |
loadBalance.maxCandidates | 对Worker分配每一个任务时的候选合格Worker数量。候选的实例是根据压力来筛选的,通常会给候选中的第一个(压力最小的),但是在网络发生问题时会切换候选中的其他实例 | 3 | 1-N |
job.dispatchTimeoutMillis | 向Worker分配任务时的超时毫秒。dispatch的过程正常是很快的,但在服务刚启动使用阶段可能会需要更大的延迟(worker需要初始化数据库连接等) | 10000 | 按需 |
schedule.recoveryScheduleMillis | 检查有可能需要恢复的任务的频率毫秒 | 60000 | 按需 |
schedule.discoveryCacheRefreshIntervalMillis | 服务发现的刷新频率毫秒。这个频率通常不需要很高 | 10000 | 按需 |
schedule.metricsCacheRefreshIntervalMillis | Worker压力度量数据的刷新频率毫秒。这通常需要较高的频率,而zk对读性能是很高的 | 3000 | 按需 |
schedule.reportScheduleCron | 报表统计触发的cron,默认每天凌晨2点执行 | 0 0 2 * * * | 按需 |
schedule.optStorageScheduleCron | 优化存储空间(mysql)触发的cron,包括删除过早的执行记录、optimize Table,默认每月15日02:00执行 | 0 0 2 15 * ? | 按需 |
schedule.optStorageDeleteBeforeDays | 优化存储空间时删除多久以前的数据(执行记录等可删的数据),默认90天 | 90 | 按需 |
security.jwt.issuer | web的jwt issuer | beecomb | 按需 |
security.jwt.secretKey | web的jwt secretKey | beecomb_jwt@icodegarden | 按需 |
security.jwt.tokenExpireSeconds | web的jwt token过期秒数 | 3600 | 按需 |
security.basicAuth.maxUserCacheSeconds | beecomb的restapi认证使用basic auth,不会每次都会从数据库加载身份信息,而是缓存方式 | 1800 | 按需 |
参数 | 描述 | 默认值 | 配置范围 |
---|---|---|---|
server.port | worker的tcp端口 | 19898 | 按端口规则 |
server.bindIp | worker的ip地址 | 网络地址 | 按ip规则 |
server.nioServerShutdownBlockingTimeoutMillis | 影响nioServer关闭时等待已接收处理中的任务完毕 | 30000 | 0-N |
server.engineShutdownBlockingTimeoutMillis | 影响任务引擎shutdown时等待正在处理中的任务完毕 | 60000 | 0-N |
zookeeper.root | beecomb在zk中的root目录 | /beecomb | 任意独占目录 |
zookeeper.connectString | zk的地址,多个以,号分隔 | 无 | 必须 |
zookeeper.connectTimeout | zk的connectTimeout | 3000 | 按需 |
zookeeper.sessionTimeout | zk的sessionTimeout | 3000 | 按需 |
zookeeper.aclAuth | zk的Auth方式认证 | beecomb:beecomb | 按需 |
loadBalance.maxCandidates | 对Executor执行每一个任务时的候选合格Executor数量。候选的实例是根据压力来筛选的,通常会给候选中的第一个(压力最小的),但是在网络发生问题时会切换候选中的其他实例 | 3 | 1-N |
schedule.discoveryCacheRefreshIntervalMillis | 服务发现的刷新频率毫秒。这个频率通常不需要很高 | 10000 | 按需 |
schedule.metricsCacheRefreshIntervalMillis | Executor压力度量数据的刷新频率毫秒。这通常需要较高的频率,而zk对读性能是很高的 | 3000 | 按需 |
schedule.flushMetricsIntervalMillis | 自身压力度量数据的定时写入频率毫秒。 | 3000 | 按需 |
overload.cpu.max | 允许cpu最大百分比 | 0.9 | 0-1 |
overload.cpu.weight | cpu对负载压力的影响权重 | 1 | 0-N 0表示忽略该项 |
overload.memory.max | 允许memory最大值 | 等于Xmx | 0-N |
overload.memory.weight | 内存对负载压力的影响权重 | 1 | 0-N 0表示忽略该项 |
overload.jobs.max | 允许负载的最多任务数量 | 该数值由算法根据cpu和内存自动得出合理数值 | 1-N |
overload.jobs.weight | 每个任务对负载压力的影响权重 | 1,当cpu、memory不开启时,job实际的影响即100% | 0-N |
参数 | 描述 | 默认值 | 配置范围 |
---|---|---|---|
server.executorPort | tcp端口 | 29898 | 按端口规则 |
server.executorIp | ip地址 | 网络地址 | 按ip规则 |
server.nioServerShutdownBlockingTimeoutMillis | 影响nioServer关闭时等待已接收处理中的任务完毕 | 60000 | 0-N |
server.minWorkerThreads | 最小工作线程数 | 20 | 1-N |
server.maxWorkerThreads | 最大工作线程数 | 200 | 1-N |
zookeeper.root | beecomb在zk中的root目录 | /beecomb | 任意独占目录 |
zookeeper.connectString | zk的地址,多个以,号分隔 | 无 | 必须 |
zookeeper.sessionTimeout | zk的sessionTimeout | 3000 | 按需 |
zookeeper.connectTimeout | zk的connectTimeout | 3000 | 按需 |
zookeeper.aclAuth | zk的Auth方式认证 | beecomb:beecomb | 按需 |
schedule.flushMetricsIntervalMillis | 自身压力度量数据的定时写入频率毫秒。 | 3000 | 按需 |
overload.cpu.max | 允许cpu最大百分比 | 0.9 | 0-1 |
overload.cpu.weight | cpu对负载压力的影响权重 | 1 | 0-N |
overload.memory.max | 允许memory最大值 | 等于Xmx | 0-N |
overload.memory.weight | 内存对负载压力的影响权重 | 1 | 0-N |
overload.jobs.max | 允许负载的最多任务数量 | 该数值由算法根据cpu和内存自动得出合理数值。默认Executor同时也视为Application,1/2资源用于Executor | 1-N |
overload.jobs.weight | 每个任务对负载压力的影响权重 | 1,当cpu、memory不开启时,job实际的影响即100% | 0-N |
beecomb的初始用户只有beecomb,他是管理员身份
在web 用户管理模块可以新增用户,以支持不同的系统接入,不同系统用户对应各自的数据权限、Client(或restapi)的身份认证
Worker、Executor具有cpu、内存、job重量数 的负载weight权重指数, 当任务分配和执行时会选择负载最低的最优实例,负载最低的实例算法是根据这几项指标的权重得出的,默认各项权重都是1 Job的weight是任务重量,值越大占负载值越大,Worker负载值=Max(weight每秒频率,weight0.1),Executor负载值=weight
延迟任务在成功后或失败次数达到阈值后,就会结束不再触发
当调度任务的返回参数设置end为true后,任务将结束不再触发调度
当并行任务的返回参数设置onParallelSuccessCallback为true,并且所有分片都执行成功后,将会触发onParallelSuccess方法的回调(只会有一个executor收到回调)
当Worker下线或某种原因导致不可用时 或 创建任务时负载感知到任务不能分配给Worker 时,这些任务会被认为需要 恢复 分配给合适的Worker,会被自动检测进行分配
最多显示前1000页
为了提升分页性能,减少数据库count开销,当任务数量超过50W时,不会触发真实count,而是按预估量。因此某些查询条件下很靠后的页数可能是假的,但随着数据量继续提升这种情况会消失,因为页面最多显示1000页
beecomb的全局id使用mysql管理,为了提升吞吐量,默认的步长是大于1的(即把可使用的id缓存在本地,使用完了再获取新的),这样在集群环境下不同实例使用的id存在差异,所以并不是严格的有序,但总体上是有序的。如果需要严格有序,可以把表id_sequence的increment(步长)设置为1,这样并发量大时性能会下降一些
支持自动清理任务的执行记录数据,默认每月的15日凌晨2点执行,过程是 删除超过90天(默认)的记录,对表进行optimize Table消除碎片