Snail Job 简介
Snail Job 是一个任务调度和任务重试平台。而且它本身已经拥有完善的权限管理、强大的告警监控功能和友好的界面交互。相较其他的任务调度平台,它拥有任务重试的独特能力。下面是与其他开源组件的对比:
| 项目 | Quartz | Elastic-Job | XXL-JOB | PowerJob | Snail Job |
|---|---|---|---|---|---|
| 定时调度 | Cron | Cron | Cron | CRON、固定频率、固定延迟、OpenAPI | 1. 定时任务 2. 秒级任务(无需依赖外部中间件)3. 固定频率 4. OpenAPI(开发中) |
| 重试任务 | 不支持 | 不支持 | 不支持 | 不支持 | 1. 支持本地 & 远程重试模式 2. 支持各种常用组件的重试 比如 Dubbo/Feign 3. 支持多种退避策略 4. 丰富的重试风暴管控手段 ...... |
| 任务编排 | 不支持 | 不支持 | 不支持 | 支持 | 仿钉钉工作流设计,颜值高、体验好 |
| 分布式计算 | 不支持 | 静态分片 | 广播 | 支持 | 1. 广播执行 2. 集群执行 3. 静态分片 4. 动态分片(开发中) |
| 多语言 | Java | 1. Java 2. 脚本任务 | 1. Java 2. 脚本任务 | 支持 | 1. Java(已支持)2. 脚本任务(开发中)3. HTTP 任务(开发中)4. Kettle(开发中) |
| 用户管理 | 不支持 | 支持 | 支持 | 不支持 | 完备的用户管理和权限管理 |
| 安全 Token | 不支持 | 不支持 | 支持 | 不支持 | 支持 |
| 可视化 | 无 | 弱 | 1. 历史记录 2. 运行日志(不支持存储)3. 监控大盘 | 支持 | 1. 历史记录 2. 实时日志(支持持久化、可视化)3. 监控大盘(实时调度数据展示)4. 失败调度排名 5. 在线集群查看等 |
| 可运维 | 无 | 启用、禁用任务 | 1. 启用、禁用任务 2. 手动运行任务 3. 停止任务 | 支持 | 1. 启用、禁用任务 2. 手动运行任务 3. 停止任务 4. 手动重试 |
| 报警监控 | 无 | 邮件 | 邮件 | 邮件 | 支持配置多种告警场景,通知方式支持:1. 邮件 2. 钉钉 3. 企微 4. 飞书 5. Webhook |
| 性能 | 每次调度通过 DB 抢锁,对 DB 压力大 | ZooKeeper 是性能瓶颈 | 采用 Master 节点调度,Master 节点压力大 | 无锁化设计 | 系统采用多 Bucket 模式,借助负载均衡算法,确保每个节点能够均衡处理任务,同时支持无限水平扩展,轻松应对海量任务调度 |
| 接入成本 | 只依赖 DB 接入成本低 | 需引入 ZooKeeper 增加系统复杂性和维护成本 | 只依赖 DB 接入成本低 | 依赖 DB 接入成本低 | 只依赖 DB 接入成本低 |
官网地址:Snail Job 文档
初体验目标
本文主要目标包括:
- 把任务后台启动起来
- 通过任务后台管理页面,进行基本配置,并大概了解配置项的基本作用
- 编写一个简单的客户端程序,实现任务调度时,打印参数信息
总而言之就是把整个 Snail Job 跑起来。通过这个过程,大概了解开发者使用者需要做的事情有哪些。
服务端启动
初识目录结构
JDK 版本要求是 >= 17。这里为了更好的查看项目目录结构,采用在 IDEA 中下载源码的方式启动项目。
项目克隆地址:Snail Job Gitee 仓库
我这里下载到的版本是:1.1.2 版本。项目结构如下:
| 目录名称 | 见名识意 |
|---|---|
doc | 文档目录。这里还包括 Docker 编排、初始化数据库的 SQL。 |
snail-job-client | 客户端的核心代码。包括定时任务和重试任务的核心代码 |
snail-job-client-starter | 客户端和 SpringBoot 集成的 Starter。处理一些自动配置 |
snail-job-common | 客户端和服务器端都要用到的通用代码。 |
snail-job-datasource | 服务端用到的数据源 |
snail-job-server | 服务端代码。 |
由于这节是要启动服务端,所以对其更深入一层了解一下 snail-job-server 模块下包括哪些内容:
| 目录名称 | 见名识意 |
|---|---|
snail-job-server-common | 服务端通用模块 |
snail-job-server-job-task | 服务端针对定时任务的模块 |
snail-job-server-retry-task | 服务端针对重试任务的模块 |
snail-job-server-starter | 服务端启动模块 |
snail-job-server-ui | 服务端管理页面模块【snail-job-admin 项目编译后内容】 |
snail-job-server-web | 服务端管理页面对应的请求接口模块 |
初始化数据库
我这里采用 MySQL 数据库为例。在 snail-job/doc/sql 目录下找到对应的数据库初始 SQL。
可以使用数据库工具 Navicat 或者 DBeaver 把 snail_job_mysql.sql 文件执行。
修改数据库连接配置
由于上面初识目录结构中说过,snail-job-server-starter 是服务端启动模块。所以这里就要修改它的配置文件。
spring:
main:
banner-mode: off
profiles:
active: dev
datasource:
name: snail_job
## MySQL
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据库的 URL
url: jdbc:mysql://local:3306/snail_job?useSSL=false&characterEncoding=utf8&useUnicode=true
# 数据库的用户名
username: root
# 数据库用户的密码
password: root启动服务端
在 IDEA 中启动
通过上面启动类在 IDEA 中进行启动。
打包为 jar 后,通过命令启动
通过 Maven 的
package进行打包,会在snail-job-server-starter模块下的target中出现snail-job-server-exec.jar包然后就可以在 JDK >= 17 的机器上执行命令启动:
java -jar snail-job-server-exec.jar
管理页-设置命名空间和组
服务端启动后,便可以访问服务端管理页面了。
- URL:
http://localhost:8080/snail-job - 用户名 / 密码:
admin/admin
设置命名空间
命名空间这里先简单的理解为开发环境。比如:dev、test、prod 等环境。
- 命名空间唯一标识要和客户端配置文件中的
snail-job.namespace值保持一致
在命名空间页面点击 新增 按钮
新增完成后,切换默认空间为 dev 空间。
设置组管理
组可以简单理解为针对某个项目、应用的一类定时都放在一组中,方便任务集中管理。
- 组名称需要和客户端配置文件中
snail-job.group的值一致 Token需要和客户端配置文件中snail-job.token的值一致
客户端启动
Snail Job 要求客户端 ≥ JDK 17,SpringBoot 3.X。但是还有一个兼容 JDK 8 的版本。这里以 JDK 8 的版本为例进行测试。不过还是建议 JDK 用 17 以上的。
Maven 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.18</version>
</dependency>
<!-- Snail Job 客户端启动依赖 -->
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId>
<version>1.1.0-jdk8-beta1</version>
</dependency>
<!-- Snail Job 重试相关依赖 -->
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-retry-core</artifactId>
<version>1.1.0-jdk8-beta1</version>
</dependency>
<!-- Snail Job 客户端核心依赖 -->
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
<version>1.1.0-jdk8-beta1</version>
</dependency>
</dependencies>配置文件
server:
port: 8888
snail-job:
server:
# 服务端的地址,若服务端集群部署则此处配置域名
host: 127.0.0.1
# 服务端 Netty 的端口号
port: 1788
# 名称空间 ID,和上面管理页中设置的命名空间中的唯一标识一致
namespace: xd6NSI6-GGm634HVQOa2_1BRVi6nlG4x
# 组名,和上面管理页中设置的组名一致
group: service_plat
# 令牌,和上面管理页中设置的组中 Token 一致
token: SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj启动加注解
@EnableSnailJob
@SpringBootApplication
public class TestSnailJobApplication {
public static void main(String[] args) {
SpringApplication.run(TestSnailJobApplication.class, args);
}
}注意:这里要加 @EnableSnailJob,否则无法执行定时任务。测试类
@Slf4j
@Component
public class TestSnailJobWithAbstractClass extends AbstractJobExecutor {
@Override
protected ExecuteResult doJobExecute(JobArgs jobArgs) {
log.info("定时任务执行成功。参数值:{}", jobArgs);
return ExecuteResult.success("定时任务执行成功");
}
}管理页-调度任务
查看客户端机器
启动客户端程序后,可以通过 在线机器 查看到启动的这个客户端。
创建定时任务
由于这个我们没有设置其他内容,默认是 1 分钟后调用客户端程序。这时可以在客户端的控制台中看到信息:
增加任务参数并手动执行任务
保存后,手动执行任务。
客户端可以看到参数值
总结
- 服务端必须
JDK≥ 17。客户端有针对JDK 8的版本。 服务端不管是通过
mvn直接打包,还是通过IDEA进行打包最终可以运行的jar在Snail-job/snail-job-server/snail-job-server-starter/target/snail-job-server-exec.jar- 命名空间可以简单理解为开发环境;客户端的
snail-job.namespace配置的唯一值与之对应 - 组可以简单理解为项目或者应用;组名对应
snail-job.group,令牌对应snail-job.token - 客户端的
SpringBoot启动类上要有注解:@EnableSnailJob 客户端的定时任务要继承
AbstractJobExecutor类补充说明:
虽然还可以通过注解方式来定义一个定时任务。但是个人感觉容易重名。所以这里仅仅通过继承类,配置全路径名的方式来做。
本笔记原文来自博主 老马 9527 的文章 1.snail-job 初体验
如有侵权,请联系作者 马铃薯头 删除















