Compare commits

...

9 Commits

5 changed files with 56 additions and 40 deletions

View File

@ -1,8 +1,6 @@
<p align="center"> <p align="center">
<a href="https://www.easyretry.com"> <a href="https://snailjob.opensnail.com/">
<img alt="Easy-Retry-Logo" src="doc/images/logo.png" width="350px"> <img alt="SnailJob-Logo" src="https://snailjob.opensnail.com/logo.svg" width="200px">
</a> </a>
</p> </p>
@ -10,17 +8,25 @@
🔥🔥🔥 致力提高分布式业务系统一致性的分布式重试平台 🔥🔥🔥 致力提高分布式业务系统一致性的分布式重试平台
</p> </p>
# JDK 支持
| JDK版本 | 对应分支 |
|-------|-----------------------------------------------------------------------------|
| ≥ 17 | [master](https://gitee.com/opensnail/snail-job-demo/tree/master/) |
| 8 | [master-jdk8](https://gitee.com/opensnail/snail-job-demo/tree/master-jdk8/) |
# 🌸 简介 # 🌸 简介
在当前广泛流行的分布式系统中确保系统数据的一致性和正确性是一项重大挑战。为了解决分布式事务问题涌现了许多理论和业务实践其中BASE理论是目前业界广泛接受的分布式一致性理论。<br/> 在当前广泛流行的分布式系统中确保系统数据的一致性和正确性是一项重大挑战。为了解决分布式事务问题涌现了许多理论和业务实践其中BASE理论是目前业界广泛接受的分布式一致性理论。<br/>
基于BASE理论采用柔性事务并优先保障系统的可用性和数据的最终一致性已逐渐成为技术共识。<br/> 基于BASE理论采用柔性事务并优先保障系统的可用性和数据的最终一致性已逐渐成为技术共识。<br/>
为了确保分布式服务的可用性和数据一致性,并防止由于网络抖动、连接超时等问题导致短时不可用的情况,根据"墨菲定律",在核心流程中增加重试和数据核对校验的动作成为提高系统鲁棒性常用的技术方案。<br/> 为了确保分布式服务的可用性和数据一致性,并防止由于网络抖动、连接超时等问题导致短时不可用的情况,根据"墨菲定律"
在此背景下EasyRetry应运而生。EasyRetry是一款致力提高分布式业务系统一致性的分布式重试平台。它提供了控制台任务观测、可配置的重试策略、重试后执行回调以及丰富地告警配置等功能。通过这些手段可以对异常数据进行全面监测和回放从而在确保系统高可用性的同时大大提升数据的一致性。<br/> ,在核心流程中增加重试和数据核对校验的动作成为提高系统鲁棒性常用的技术方案。<br/>
在此背景下SnailJob应运而生。SnailJob是一款致力提高分布式业务系统一致性的分布式重试平台。它提供了控制台任务观测、可配置的重试策略、重试后执行回调以及丰富地告警配置等功能。通过这些手段可以对异常数据进行全面监测和回放从而在确保系统高可用性的同时大大提升数据的一致性。<br/>
# 🌼 重试方案对比
![img.png](doc/images/retry-strategy.png)
# 🍀 特性 # 🍀 特性
Easy-RETRY 是一个针对业务系统重试流量的治理平台,其自身具有高可用高性能高负载的特点,服务特性有:
SnailJob 是一个针对业务系统重试流量的治理平台,其自身具有高可用高性能高负载的特点,服务特性有:
+ 支持千万级别的重试流量分派 + 支持千万级别的重试流量分派
+ 支持流量容量扩容,自动识别并处理 + 支持流量容量扩容,自动识别并处理
+ 支持流量处理节点水平扩容 + 支持流量处理节点水平扩容
@ -29,32 +35,34 @@ Easy-RETRY 是一个针对业务系统重试流量的治理平台,其自身具
+ 打包上报,支持高并发业务场景 + 打包上报,支持高并发业务场景
+ 加密通讯,保障信息安全 + 加密通讯,保障信息安全
# 🌺 业务场景 # 后台预览地址
- https://www.easyretry.com/pages/406a68/
# 流量管理平台预览 地址: <https://preview.snailjob.opensnail.com/>
地址: <http://preview.easyretry.com/>
账号: admin
密码: admin
## 特别用户 ## 特别用户
<a href="http://aizuda.com/?from=mp">![aizuda.png](doc/images/aizuda.png)</a>
<a href="http://aizuda.com/?from=mp">![aizuda.png](https://gitee.com/aizuda/snail-job/raw/master/doc/images/aizuda.png)</a>
## 相关链接 ## 相关链接
- [字节跳动: 如何优雅地重试](https://juejin.cn/post/6914091859463634951) - [字节跳动: 如何优雅地重试](https://juejin.cn/post/6914091859463634951)
- [这款分布式重试组件,治好了我的重试强迫症!](https://juejin.cn/post/7249607108043145274) - [这款分布式重试组件,治好了我的重试强迫症!](https://juejin.cn/post/7249607108043145274)
- [系统简介](https://www.easyretry.com/pages/d1d1da/) - [系统简介](https://www.easyretry.com/pages/d1d1da/)
- [架构与功能](https://www.easyretry.com/pages/540554/) - [架构与功能](https://www.easyretry.com/pages/540554/)
## 原理 ## 原理
- [场景应用](https://www.easyretry.com/pages/406a68/) - [场景应用](https://www.easyretry.com/pages/406a68/)
- [HelloWorld](https://www.easyretry.com/pages/da9ecc/) - [HelloWorld](https://www.easyretry.com/pages/da9ecc/)
## 应用实例 ## 应用实例
- [easy-retry-demo](https://gitee.com/zhangyutongxue/easy-retry-demo) - [easy-retry-demo](https://gitee.com/zhangyutongxue/easy-retry-demo)
## 期望 ## 期望
欢迎提出更好的意见,帮助完善 Easy-Retry 欢迎提出更好的意见,帮助完善 Easy-Retry
## 版权 ## 版权
[Apache-2.0](https://gitee.com/aizuda/easy-retry/blob/master/LICENSE) [Apache-2.0](https://gitee.com/aizuda/easy-retry/blob/master/LICENSE)

43
pom.xml
View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.2</version> <version>2.7.18</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
@ -16,7 +16,8 @@
<description>Demo project for Spring Boot</description> <description>Demo project for Spring Boot</description>
<properties> <properties>
<java.version>17</java.version> <java.version>1.8</java.version>
<snailjob.version>1.2.0-jdk8-beta3.grpc</snailjob.version>
</properties> </properties>
<dependencies> <dependencies>
@ -44,17 +45,17 @@
<dependency> <dependency>
<groupId>com.aizuda</groupId> <groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId> <artifactId>snail-job-client-starter</artifactId>
<version>1.1.0</version> <version>${snailjob.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.aizuda</groupId> <groupId>com.aizuda</groupId>
<artifactId>snail-job-client-retry-core</artifactId> <artifactId>snail-job-client-retry-core</artifactId>
<version>1.1.0</version> <version>${snailjob.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.aizuda</groupId> <groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId> <artifactId>snail-job-client-job-core</artifactId>
<version>1.1.0</version> <version>${snailjob.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.googlecode.aviator</groupId> <groupId>com.googlecode.aviator</groupId>
@ -66,11 +67,6 @@
<artifactId>QLExpress</artifactId> <artifactId>QLExpress</artifactId>
<version>3.3.1</version> <version>3.3.1</version>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId> <artifactId>mybatis-plus-generator</artifactId>
@ -84,18 +80,20 @@
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
<version>5.8.19</version> <version>5.8.23</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version> <version>8.0.30</version>
<exclusions>
<exclusion>
<artifactId>protobuf-java</artifactId>
<groupId>com.google.protobuf</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.2.0</version>
</dependency>
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId> <artifactId>transmittable-thread-local</artifactId>
@ -121,6 +119,19 @@
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>1.2.83</version> <version>1.2.83</version>
</dependency> </dependency>
<!-- jdk8 -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -6,7 +6,6 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.concurrent.locks.ReentrantLock;
@SpringBootApplication @SpringBootApplication
@EnableSnailJob @EnableSnailJob
@ -14,9 +13,6 @@ import java.util.concurrent.locks.ReentrantLock;
public class SnailJobSpringbootApplication { public class SnailJobSpringbootApplication {
public static void main(String[] args) { public static void main(String[] args) {
ReentrantLock reentrantLock = new ReentrantLock();
reentrantLock.lock();
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
SpringApplication.run(SnailJobSpringbootApplication.class, args); SpringApplication.run(SnailJobSpringbootApplication.class, args);
} }

View File

@ -5,7 +5,7 @@ import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.models.GroupedOpenApi; import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;

View File

@ -46,7 +46,7 @@ snail-job:
# 服务器IP地址或域名集群时建议通过 nginx 做负载均衡 # 服务器IP地址或域名集群时建议通过 nginx 做负载均衡
host: 127.0.0.1 host: 127.0.0.1
# 服务器通讯端口(不是后台管理页面服务端口) # 服务器通讯端口(不是后台管理页面服务端口)
port: 1788 port: 17888
# 命名空间 # 命名空间
namespace: 764d604ec6fc45f68cd92514c40e9e1a namespace: 764d604ec6fc45f68cd92514c40e9e1a
# 接入组名 # 接入组名
@ -56,4 +56,5 @@ snail-job:
# 客户端绑定IP必须服务器可以访问到默认自动推断在服务器无法调度客户端时需要手动配置 # 客户端绑定IP必须服务器可以访问到默认自动推断在服务器无法调度客户端时需要手动配置
host: 127.0.0.1 host: 127.0.0.1
# 客户端通讯端口,默认 1789 # 客户端通讯端口,默认 1789
port: 1789 port: 17889
rpcType: grpc