分布式任务调度框架-PowerJob
分布式任务调度框架-PowerJob
只会用 xxl-job?更强大的新一代分布式任务调度框架来了!
在微服务系统中,经常会有用到任务调度的场景。比如每天定时同步数据、定时生成业务报表、定期清理日志等。今天给大家推荐一个分布式调度框架,助你你轻松完成任务调度工作!
PowerJob 简介
PowerJob是全新一代分布式调度与计算框架,能让你轻松完成任务的调度与繁杂任务的分布式计算。
主要特性:
- 使用简单:提供前端Web界面,允许开发者可视化地完成调度任务的管理(增、删、改、查)、任务运行状态监控和运行日志查看等功能。
- 定时策略完善:支持CRON表达式、固定频率、固定延迟和API四种定时调度策略。
- 执行模式丰富:支持单机、广播、Map、MapReduce四种执行模式,其中Map/MapReduce处理器能使开发者寥寥数行代码便获得集群分布式计算的能力。
- DAG工作流支持:支持在线配置任务依赖关系,可视化得对任务进行编排,同时还支持上下游任务间的数据传递
- 执行器支持广泛:支持Spring Bean、内置/外置Java类、Shell、Python等处理器,应用范围广。
- 运维便捷:支持在线日志功能,执行器产生的日志可以在前端控制台页面实时显示,降低debug成本,极大地提高开发效率。
- 依赖精简:最小仅依赖关系型数据库(MySQL/Oracle/MS SQLServer…)。
- 高可用&高性能:调度服务器经过精心设计,一改其他调度框架基于数据库锁的策略,实现了无锁化调度。部署多个调度服务器可以同时实现高可用和性能的提升(支持无限的水平扩展)。
- 故障转移与恢复:任务执行失败后,可根据配置的重试策略完成重试,只要执行器集群有足够的计算节点,任务就能顺利完成。
为什么要有调度中心
一般情况下我们会使用QuartZ
或Spring Task
这些框架在应用中实现定时任务来进行任务调度,但是在微服务架构下,如果很多应用都充斥着这种任务调度代码就显得有些不合适。合理的方案应该是这样的,任务的执行方法存在于应用中,而我们有一个调度中心,调度中心负责调度这些方法,我们只需在调度中心配置好任务即可,PowerJob正是这样一个分布式调度框架。
适用场景
- 有定时执行需求的业务场景:如每天凌晨全量同步数据、生成业务报表等。
- 有需要全部机器一同执行的业务场景:如使用广播执行模式清理集群日志。
- 有需要分布式处理的业务场景:比如需要更新一大批数据,单机执行耗时非常长,可以使用Map/MapReduce处理器完成任务的分发,调动整个集群加速计算。
- 有需要延迟执行某些任务的业务场景:比如订单过期处理等。
同类产品对比
QuartZ | xxl-job | SchedulerX 2.0 | PowerJob | |
---|---|---|---|---|
定时类型 | CRON | CRON | CRON、固定频率、固定延迟、OpenAPI | CRON、固定频率、固定延迟、OpenAPI |
任务类型 | 内置Java | 内置Java、GLUE Java、Shell、Python等脚本 | 内置Java、外置Java(FatJar)、Shell、Python等脚本 | 内置Java、外置Java(容器)、Shell、Python等脚本 |
分布式计算 | 无 | 静态分片 | MapReduce动态分片 | MapReduce动态分片 |
在线任务治理 | 不支持 | 支持 | 支持 | 支持 |
日志白屏化 | 不支持 | 支持 | 不支持 | 支持 |
调度方式及性能 | 基于数据库锁,有性能瓶颈 | 基于数据库锁,有性能瓶颈 | 不详 | 无锁化设计,性能强劲无上限 |
报警监控 | 无 | 邮件 | 短信 | WebHook、邮件、钉钉与自定义扩展 |
系统依赖 | JDBC支持的关系型数据库(MySQL、Oracle…) | MySQL | 人民币 | 任意Spring Data Jpa支持的关系型数据库(MySQL、Oracle…) |
DAG工作流 | 不支持 | 不支持 | 支持 | 支持 |
官方文档
具体操作请查看**中文文档**
安装准备
由于PowerJob的调度中心(powerjob-server)需要使用MySQL存储数据,使用MongoDB存储日志,所以我们先安装并启动这两个服务。
- 在Docker容器中启动MySQL服务;
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 在MySQL中创建PowerJob需要的数据库
powerjob-product
;
CREATE DATABASE IF NOT EXISTS `powerjob-product` DEFAULT CHARSET utf8mb4
- 在Docker容器中启动MongoDB服务。
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5
安装调度中心
在Docker环境下安装PowerJob的调度中心非常简单,分分钟搞定!
- 下载镜像
powerjob-server
的Docker镜像:
docker pull tjqq/powerjob-server:latest
- 在Docker容器中运行
powerjob-server
服务:
docker run -p 7700:7700 -p 10086:10086 --name powerjob-server \
--link mysql:db \
--link mongo:mongo \
-e TZ="Asia/Shanghai" \
-e JVMOPTIONS="" \
-e PARAMS="--spring.profiles.active=product --spring.datasource.core.jdbc-url=jdbc:mysql://db:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8 --spring.datasource.core.username=root --spring.datasource.core.password=root --spring.data.mongodb.uri=mongodb://mongo:27017/powerjob-product" \
-v ~/docker/powerjob-server:/mydata/powerjob/powerjob-server \
-v ~/.m2:/mydata/powerjob/.m2 \
-d tjqq/powerjob-server:latest
- 运行成功后即可访问
powerjob-server
的Web界面,注意Linux防火墙需要开放7700
和10086
两个端口,访问地址:http://192.168.3.101:7700/
在应用中初始化执行器
安装完调度中心后,我们需要在SpringBoot应用中初始化PowerJob的执行器(powerjob-worker)。
- 首先在
pom.xml
中添加powerjob-worker
的相关依赖:
<dependency>
<groupId>com.github.kfcfans</groupId>
<artifactId>powerjob-worker-spring-boot-starter</artifactId>
<version>3.2.3</version>
</dependency>
- 之后在
application.yml
配置文件中添加powerjob-worker
相关配置,注意powerjob.worker.app-name
这个配置;
powerjob:
worker:
akka-port: 27777 # akka 工作端口
app-name: mall-tiny-powerjob # 接入应用名称,用于分组隔离
server-address: 192.168.3.101:7700 # 调度服务器地址
store-strategy: disk # 持久化方式
- 添加一个单机处理器
StandaloneProcessor
,只需继承BasicProcessor
接口并实现process
方法即可;
package com.macro.mall.tiny.job;
@Slf4j
@Component
public class StandaloneProcessor implements BasicProcessor {
@Override
public ProcessResult process(TaskContext context){
//OmsLogger可以直接将日志上报到powerjob-server
OmsLogger omsLogger = context.getOmsLogger();
omsLogger.info("StandaloneProcessor start process,context is {}.", context);
log.info("jobParams is {}", context.getJobParams());
return new ProcessResult(true, "Process success!");
}
}
- 打包上传好镜像后,在Docker容器中运行SpringBoot应用服务,注意配置好时区要和调度中心一致。
docker run -p 8080:8080 --name mall-tiny-powerjob \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny-powerjob/logs:/var/logs \
-e TZ="Asia/Shanghai" \
-d mall-tiny/mall-tiny-powerjob:1.0-SNAPSHOT
任务的配置与执行
有了执行器和调度中心,我们只需在调度中心中配置好任务即可实现任务调度。
- 首先我们需要在调度中心注册好应用(集成执行器的),应用名称为
application.yml
中的powerjob.worker.app-name
属性,这里使用的是mall-tiny-powerjob:123456
;
- 之后我们可以在首页看见一台机器信息;
- 之后在
任务管理
功能中添加一个任务,这里我们用CRON
方式设置每20秒
执行执行器中的处理方法;
- 在任务列表中点击
运行
开始执行任务;
- 在任务列表中点击
更多->运行记录
可以查看任务的运行日志;
- 点击
日志
可以查看处理器中上报的日志,jobParams
为之前我们创建任务时设置的参数;
- 点击
详情
可以查看此次触发任务的结果,即我们在ProcessResult
中返回的信息。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 fanfanの博客!