前言
在分布式系统中,任务失败几乎是不可避免的现象,可能是由于网络波动、服务暂时不可用等多种原因导致。为了确保系统的稳定性和可靠性,我们需要一种机制来自动处理这些失败情况,使任务能够在失败后自动重试,直至成功完成。
此外,随着业务规模的增长,任务调度的需求也越来越多样化,不仅需要支持定时任务,还需要支持更加复杂的任务编排和分片处理。 image.png
那么,有没有一个既灵活又可靠的平台,可以满足这些需求呢?答案是肯定的------SnailJob 正是为此而生。
SnailJob 简介
SnailJob 是一个高度灵活、可靠且高-效的分布式任务重试和任务调度平台。它采用了先进的分区模式实现,具备出色的可伸缩性和容错性。SnailJob 提供了完善的权限管理、强大的告警监控功能以及友好的用户界面交互。 image.png
特点
-
分布式重试任务:支持多样化的重试类型、退避策略、流量管控等。
-
分布式调度任务:提供丰富的任务触发策略、任务编排、任务分片、停止恢复、失败重试等功能。
-
可视化任务编排:仿钉钉工作流引擎设计,具备良好的用户体验、精美的界面、简便直观的cao作特性。
-
多样化的告警方式:支持email 、企业微-信、钉钉、飞书、Webhook等多种告警方式。
技术架构
SnailJob 采用了一套先进的技术栈,确保了其在性能和稳定性方面的卓越表现。它无需依赖外部中间件即可实现秒级任务间隔调度,支持多种执行模式(如集qun 模式、广播模式和分片模式)和阻塞策略(如丢弃、覆盖和并行),从而显著提高了任务执行效率。
部署 SnailJob
1. 准备环境
-
Java 环境:确保已安装 JDK 1.8 或更高版本。
-
MySQL 数据库:建议使用 MySQL 5.7 或更高版本。
2. 获取代码
-
从 GitHub 或 Gitee 下载 SnailJob 的新版本。
-
使用 Git 克隆 SnailJob 项目:
git clone https://gitee.com/aizuda/snail-job.git
3. 配置环境
-
数据库初始化:根据文档中的说明,创建数据库并导入 SQL 脚本。
-
配置文件设置 :修改
src/main/resources/application.properties
文件,配置正确的数据库连接信息以及其他必要的参数。
4. 构建项目
-
使用 Maven 构建项目:
mvn clean package -Dmaven.test.skip=true
-
构建完成后,会在
target
目录下生成可执行的 JAR 文件。
5. 启动服务
-
执行生成的 JAR 文件启动服务:
java -jar target/snail-job-server.jar
6. 验证部署
-
打开浏览器,访问 SnailJob 的管理界面:
localhost:8080/snail-job
-
登录后检查各项功能是否正常运行。
开源协议
SnailJob 采用 Apache License Version 2.0 开源协议。
即刻体验一波
命名空间
使用 Snail Job,要创建一个命名空间。用户可以创建、编辑、切换、删除空间(请注意,删除命名空间是物理删除,一旦删除无法恢复,请谨慎cao作)。命名空间的weiyi标识要与客户端配置文件中的 snail-job.namespace
值保持一致。 image.png image.png
组管理
针对不同模块可以建立不同的分组,便于任务集中管理。用户可以创建、编辑、删除、停用、启用组(同样需要注意,删除组是物理删除,一旦删除无法恢复,请谨慎cao作)。组配置的组名称需要与客户端的配置文件或启动方法上的注解保持一致,组配置的 Token 也需要与客户端的配置文件保持一致。 image.png image.png image.png
定时任务
在定时任务管理中,除了常用的集qun 、广播、静态分片模式外,SnailJob 还集成了 Map 和 MapReduce 等高级特性,用户可以根据业务场景选择合适的任务类型。 image.png image.png
Hello World 示例
准备工作
创建一个 SpringBoot 应用,并引入 Maven 坐标:
<dependencies>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId>
<version>{Latest Version}</version>
</dependency>
<!-- 重试模块 -->
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-retry-core</artifactId>
<version>{Latest Version}</version>
</dependency>
<!-- 定时任务 -->
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
<version>{Latest Version}</version>
</dependency>
</dependencies>
启动项配置
然后,在 SpringBoot 的启动项上增加注解 @EnableSnailJob
:
@SpringBootApplication
@EnableEasyRetry(group = "snail_job_demo_group")
public class SnailJobSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(EasyRetrySpringbootApplication.class, args);
}
}
这个启动类中写入的 snail_job_demo_group
对应的是控制台中的组名称。
重试案例演示
接下来,我们编写一个简单的 Service 服务应用:
@Component
public class LocalRetryService {
@Retryable(scene = "localRemote")
public void localRemote() {
System.out.println("local retry 方法开始执行");
double i = 1 / 0;
}
}
可以看到这段代码中我们添加了一个注解 @Retryable(scene = "localRemote")
,在其中设定了参数值 scene
,这个 scene
对应着控制台中的场景,可以理解为场景就是组下面的weiyi标识。接下来我们来测试一下这段代码:
@Test
public void localRemoteTest() {
localRetryService.localRemote();
}
当不设定重试次数时,默认会重试三次,因此我们可以看到控制台上共打印了四次 "local retry 方法开始执行" 后才抛出 ArithmeticException 异常信息。
定时任务案例演示
注解方式: 配置定时任务 testJobExecutor
:
@Component
@JobExecutor(name = "testJobExecutor")
public class TestAnnoJobExecutor {
public ExecuteResult jobExecute(JobArgs jobArgs) {
return ExecuteResult.success("注解方式-测试成功");
}
}
继承类 AbstractJobExecutor: 配置定时任务 testClassJobExecutor
:
@Component
public class TestClassJobExecutor extends AbstractJobExecutor {
@Override
protected ExecuteResult doJobExecute(JobArgs jobArgs) {
return ExecuteResult.success("继承AbstractJobExecutor-测试成功");
}
}
以上是 SnailJob 的一些基本使用示例,您可以根据实际需求进行调整和扩展。
结语
SnailJob 以其灵活性、可靠性和高-效性成为了分布式任务重试与调度领域的佼佼者。无论您是在寻找一个能够提高分布式业务系统一致性的分布式任务重试平台,还是需要一个支持秒级、可中断、可编排的高性能分布式任务调度平台,SnailJob 能满足您的需求。现在就开始探索 SnailJob 的强大功能吧!
历史精选
开源|一款原创文学 CMS 系统:支持 PC 和 WAP 多端阅读平台、自动化爬虫、定制化模板、作家管理
一个功能很完善的合同管理系统,支持合同签署,存档,执行,跟踪,变更,续签或终止,报告和分析等功能
全栈开发实战:Spring Boot 3 + Vue 3 打造小说门户、作家后台及平台管理系统的开源解决方案