Snail-Job:简介、原理、实战
概述官网Java实现、开源Gitee3.6K Star652 ForkGitHub822 Star112 Fork灵活可靠和快速的分布式任务重试和分布式任务调度平台。在线体验地址登录用户名密码developer/123456。功能分布式重试任务支持多样化的重试类型、退避策略、流量管控等分布式调度任务提供丰富的任务触发策略、任务编排、任务分片、停止恢复、失败重试等可视化任务编排仿钉钉工作流引擎设计具备良好的用户体验、精美的界面、简便直观的操作特性支持多样化的告警方式邮箱、企业微信、钉钉、飞书、Webhook核心特性1. 易用性注重用户体验提供简单直观的操作界面和完善的学习资源快速接入简单的配置即可完成系统搭建完善文档详细的文档帮助用户快速上手视频教程全流程视频讲解沉浸式学习体验友好界面现代化UI设计操作简单直观2. 高性能采用先进的技术架构确保系统的高性能和可扩展性多Bucket模式借助负载均衡算法确保节点均衡处理任务无锁化设计充分利用集群能力实现高效调度高性能通信基于Netty的高性能通信框架水平扩展支持无限水平扩展轻松应对海量任务3. 安全性多层次的安全措施保护用户数据和系统安全Token验证严格的客户端Token验证机制权限管理细粒度的权限控制支持多租户数据加密敏感数据加密存储访问控制严格的访问控制策略4. 分布式重试提供完整的分布式重试解决方案确保任务可靠执行数据持久化支持数据固化和管理重试风暴防护完善的重试风暴管控机制风险管控多样化退避策略多样化重试类型流量管控丰富注解满足日常开发需求告警机制场景重试数量阈值告警场景重试失败数量阈值告警任务重试次数阈值告警死信队列告警5. 分布式调度高性能的分布式任务调度框架支持多种调度模式任务编排仿钉钉工作流引擎设计良好的用户体验精美的界面简便直观的操作执行模式集群模式广播模式分片模式动态分片开发中调度方式定时调度手动触发依赖调度工作流编排失败处理FailOver支持可视化配置客户端执行失败重试阻塞策略丢弃覆盖并行监控告警完善的监控指标多渠道告警通知实时日志支持调度日志实时查看6. 扩展功能告警通知邮箱企业微信钉钉飞书Webhook数据大盘实时系统执行数据任务汇总统计部署支持数据库自动安装脚本Docker容器部署用户管理用户权限控制多租户支持目录结构源码snail-job ├─doc # 文档目录包括docker编排、初始化数据库sql │ ├─docker # 数据库docker镜像安装脚本 │ ├─images # 图片资源 │ ├─script # sh/bat启动工具 │ ├─sql # mysql/dm8/kingbase等ddl文件 │ └─tool # 表结构同步工具 ├─snail-job-client # 客户端核心代码包括定时任务和重试任务的核心代码 │ ├─snail-job-client-common # 客户端通用模块 │ ├─snail-job-client-job-core # 客户端针对定时任务模块 │ └─snail-job-client-retry-core # 客户端针对重试任务模块 ├─snail-job-client-starter # 客户端和springboot集成的starter处理一些自动配置 ├─snail-job-common # 客户端和服务器端都要用到的通用代码 │ ├─snail-job-common-model # 通用API模块自1.7.0 │ ├─snail-job-common-core # 通用核心模块 │ ├─snail-job-common-log # 通用日志模块 ├─snail-job-datasource # 服务端用到的数据源 │ ├─snail-job-datasource-template # 数据源模板模块 │ ├─snail-job-dm8-datasource # dm8 │ ├─snail-job-kingbase-datasource # kingbase │ ├─snail-job-mariadb-datasource # mariadb │ ├─snail-job-mysql-datasource # mysql │ ├─snail-job-oracle-datasource # oracle │ ├─snail-job-postgres-datasource # postgres │ └─snail-job-sqlserver-datasource # sqlserver ├─snail-job-server-dispatcher # 服务端调度代码自1.7.0 │ ├─snail-job-server-common # 服务端通用模块自1.7.0 │ ├─snail-job-server-job-task # 服务端针对定时任务的模块 │ ├─snail-job-server-retry-task # 服务端针对重试任务的模块 ├─snail-job-server-interface # 接口相关代码自1.7.0 │ ├─snail-job-server-openapi # openapi自1.7.0 │ ├─snail-job-server-service # openapi与web共用的代码自1.7.0 │ ├─snail-job-server-ui # 服务端管理页面模块【snail-job-admin项目编译后内容】 │ └─snail-job-server-web # 服务端管理页面对应的请求接口模块 └─snail-job-server-starter # 服务端启动模块Demo官方提供Demo示例学习Snail-Job的绝佳资料。gitclone https://gitee.com/opensnail/snail-job-demo.gitcdsnail-job-demo# 需JDK17java-jarsnail-job-example.jar浏览器打开http://localhost:8018/swagger-ui查看Swagger接口。原理Retryable注解参数描述默认值必须指定scene场景无✅include包含的异常无❌exclude排除的异常无❌retryStrategy重试策略LOCAL_REMOTE✅retryMethod重试处理入口RetryAnnotationMethod✅idempotentId幂等id生成器SimpleIdempotentIdGenerate✅retryCompleteCallback服务端重试完成(重试成功、重试到达最大次数)回调客户端SimpleRetryCompleteCallback❌isThrowException本地重试完成后是否抛出异常true❌bizNo标识具有业务特点的值比如订单号、物流编号等可根据具体的业务场景生成具体生产规则参考Spi扩展点无❌localTimes本地重试次数次数必须大于等于13✅localInterval本地重试间隔时间(s)2✅timeout同步(async:false)上报数据需要配置超时时间60*1000❌unit超时时间单位TimeUnit.MILLISECONDS❌forceReport是否强制上报数据到服务端false❌async是否异步上报数据到服务端true❌propagation- 当设置为REQUIRED时如果当前重试存在就加入到当前重试中即外部入口触发重试如果当前重试不存在就创建一个新的重试任务- 当设置为REQUIRES_NEW时无论当前重试任务是否存在都会一个新的重试任务。REQUIRED✅methodResult当isThrowExceptionfalse时允许用户返回自定义值1.基于异常重试时生效2.若自定义返回值类型与方法的返回值不同时返回NULLNULL❌retryIfResult当方法正常返回结果时允许用户针对返回结果判断是否需要开启重试false❌退避策略指在发生异常时用于调节重试时间间隔的机制 目的是减少对系统资源的压力和提高成功率。基本思想是在每次重试失败后增加等待时间以便让系统有更多的时间恢复。延迟等级参考RocketMQ的messageDelayLevel设计实现最大重试次数为21次具体延迟时间如下10s,15s,30s,35s,40s,50s,1m,2m,4m,6m,8m,10m,20m,40m,1h,2h,3h,4h,5h,6h,7h,8h,9h,10h,11h,12h轮询策略也叫路由策略一种简单而有效的方法按照顺序依次将任务分发给不同的节点确保任务在集群中平均分布达到负载均衡的效果一致性Hash基于哈希函数将任务和节点映射到一个固定的哈希环上。当有新的节点加入或节点离开时只需重新计算少量的映射关系而不会影响到大部分任务的分配。保持相对的稳定性和负载均衡随机将任务随机分配给集群中的一个节点。每次任务触发时系统会随机选择一个节点来执行任务。尽管简单但也具有一定的负载均衡效果适用于某些场景下的随机化需求LRULeast Recently Used基于最近使用原则将任务分配给最近最少被使用的节点。保持节点的活跃性避免任务集中在某个节点上执行可提高系统的性能和稳定性调用链超时控制参考TCP/IP协议TTL用于判断数据包在网络中的时间是否太长而应被丢弃。一种全链路式的调用超时可用来判断当前RPC请求是否还需要继续下去。在RPC请求调用链中会带上超时时间且每经过一层就减去该层处理时间若剩下时间已经≤0则可不需要再请求下游直接返回失败即可。幂等ID在配置完其他属性之后客户端连通的情况下可自动生成MD5格式的串用户也可手动输入自定义的幂等ID。同一个组的同一个场景下只会存在一个相同的幂等ID并且状态为’重试中’的任务若存在相同的则上报服务后会被幂等处理。回调任务重试任务状态为终态时完成或到达最大次数系统会产生一条与之对应的回调任务客户端根据自身的业务特点执行一些操作如告警。死信任务倘若重试任务超过最大重试次数后将会从任务管理中删除加入到死信队列中此时我可为这条任务是一条死信不再进行重试执行。当然如果在业务中因为下游Bug导致本任务的重试一直不成功也可点击死信队列管理中的回滚将这条死信消息重新放入到任务管理中满足触发时间再次执行重试任务。工作流采用DAG结构旨在为同一命名空间和组内的定时任务提供灵活的任务调度编排。不仅支持任务的串行和并行执行还具备任务间上下文传递的能力。当前上下文传递确保子任务能够获取其父任务的上下文信息在执行效率的考量下子任务也可能接收到其他同级任务的上下文内容。在执行批次模式下可看到实时的任务状态刷新可直观的看到任务的执行顺序可动态的观察任务的执行状态。实战提供源码实战部署需Git、Maven、JDK17、MySQL等环境gitclone https://gitee.com/aizuda/snail-job.gitcdsnail-job mvn clean packagejava-jarsnail-job-server/snail-job-server-starter/target/snail-job-server-exec.jar初始化数据库脚本位置doc/sql/snail_job_mysql.sql包含建库语句默认使用snail_job数据库。建议保留该默认配置不要与业务数据库混同放在一起。配置文件位置snail-job-server/snail-job-server-starter/src/main/resources/application.ymlspring:datasource:name:snail_joburl:jdbc:mysql://localhost:3306/snail_job?useSSLfalsecharacterEncodingutf8useUnicodetrueusername:rootpassword:root# 其他配置信息...snail-job:# 任务调度服务器信息server:# 服务器IP地址或域名集群时建议通过Nginx做负载均衡host:127.0.0.1# 服务器通讯端口port:17888# 命名空间namespace:a1NSize1D5jP83Wj0B6Hre094f7kFeHB# 执行器组名称group:test_sj_group# 执行器组tokentoken:SJ_t3GFbbDCpmznt9M9Pp62GYJecE6S9q9H# 客户端绑定IP必须服务器可访问到默认自动推断在服务器无法调度客户端时需要手动配置host:127.0.0.1# 客户端通讯端口默认17889port:17899# 实时日志配置logging:config:classpath:logback-boot.xml按需修改配置文件。启动成功后访问管理控制台http://localhost:8080/snail-job登录用户名密码admin/admin。使用默认的命名空间或给某个业务组创建属于它的单独的命名空间。创建执行器组。Spring Boot应用引入如下依赖dependencies!-- 必须引入的核心依赖 --dependencygroupIdcom.aizuda/groupIdartifactIdsnail-job-client-starter/artifactIdversion{Latest Version}/version/dependency!-- 按需引入重试模块 --dependencygroupIdcom.aizuda/groupIdartifactIdsnail-job-client-retry-core/artifactId/dependency!-- 按需引入定时任务 --dependencygroupIdcom.aizuda/groupIdartifactIdsnail-job-client-job-core/artifactId/dependency/dependencies在SpringBoot启动类上添加EnableSnailJob注解。logback-boot.xml日志打印配置文件追加如下配置项!-- Snail appender --appendernamesnailLogAppenderclasscom.aizuda.snailjob.client.common.appender.SnailLogbackAppender/appender!-- 控制台输出日志级别 --rootlevelinfo!-- 其他配置 --appender-refrefsnailLogAppender//root启动Spring Boot应用在控制台中点击在线机器检查客户端是否注册成功。编写执行器ComponentJobExecutor(nametestJob)publicclassTestJob{publicExecuteResultjobExecute(JobArgsjobArgs){SnailJobLog.REMOTE.info(哈哈测试成功了);RequestAddJobDTOjobDTOOpenApiBuilder.newBuilder().broadcast().jobParams().jobName().build();returnExecuteResult.success();}}编写重试接口RestControllerpublicclassRetryController{AutowiredprivateRetryServiceretryService;GetMapping(/snail-job/retry)publicvoidretry(){retryService.retry(test);}}ComponentpublicclassRetryService{Retryable(scenetest_sj_retry,retryStrategyRetryType.LOCAL_REMOTE)publicvoidretry(Strings){doublei1/0;}}模拟触发重试GET http://localhost:8081/snail-job/retry迁移工具官方提供迁移工具目前支持从XXL-JOB一键快速迁移至Snail-Job有效降低迁移过渡过程中的复杂性。gitclone https://gitee.com/opensnail/migration-tool.gitcdmigration-tool mvn cleaninstalljava-jar./target/snail-job-migration-tool.jar浏览器访问http://localhost:8088。注意事项Snail-Job与XXL-JOB功能差异导致如下字段无法迁移misfire_strategyvarchar(50)NOTNULLDEFAULTDO_NOTHINGCOMMENT调度过期策略,authorvarchar(64)DEFAULTNULLCOMMENT作者,glue_typevarchar(50)NOTNULLCOMMENTGLUE类型,glue_sourcemediumtextCOMMENTGLUE源代码,glue_remarkvarchar(128)DEFAULTNULLCOMMENTGLUE备注,glue_updatetimedatetimeDEFAULTNULLCOMMENTGLUE更新时间,child_jobidvarchar(255)DEFAULTNULLCOMMENT子任务ID多个逗号分隔,阻塞策略对应关系如下XXL-JOBSnail-Job单机串行执行丢弃丢弃后续调度丢弃覆盖之前调度覆盖路由策略对应关系如下XXL-JOBSnail-Job第一个第一个最后一个最后一个轮询轮询随机随机一致性HASH一致性HASH最不经常使用轮询最近最久未使用一致性HASH故障转移轮询忙碌转移轮询分片广播使用广播类型替换PRO与开源版本体验地址登录用户名密码admin/adminsnail123。功能开源版本PRO版本描述基础能力✅✅目前开源版本所有的功能AI执行器❌✅基于Ai执行器开发的SnailJobAi智能客服日志独立存储❌✅目前PRO版本采用mongo或者ES存储任务维度日志清理功能❌✅支持按照任务维度设置保留条数和保留天数支持动态配置SSO配置❌✅支持RuoYi-Vue-Plus、钉钉、百度、GitHub、Gitee、微信、GitLab、Topiam等23种类型系统日志❌✅系统操作日志服务端缓存改造❌✅1.废弃DB分布式锁采用Redis实现2.全流程缓存优化处理注册中心Redis改造❌✅利用Redis替代现在的DB模式工作流执行跨组执行❌✅【待实现(后面开源版本也会支持)】节点监控❌✅系统JVM/CPU/内存等监控大盘延迟任务❌✅待实现SDK除Java外官方提供Python和Go语言客户端。

相关新闻

MySQL8.0定时删除数据实战:Event Scheduler与分批清理大表日志

MySQL8.0定时删除数据实战:Event Scheduler与分批清理大表日志

先说个真实场景。我去年接手一套订单系统的时候,发现一张操作日志表在半年内从不到1GB涨到了近30GB。业务方最初说“日志不删也不影响主流程”,直到某天大促脚本在凌晨跑批卡了十几分钟,磁盘IO被日志表的数据文件打到接近100%,清理…

2026/9/26 3:33:38 阅读更多 →
S004H-基于STM32智能门禁系统(密码、指纹、蓝牙)【Proteus仿真+Keil程序+原理图】

S004H-基于STM32智能门禁系统(密码、指纹、蓝牙)【Proteus仿真+Keil程序+原理图】

☆、设计硬件组成:STM32单片机最小系统4*4矩阵键盘AS608指纹识别模块HC-05蓝牙模块OLED液晶显示继电器蜂鸣器红色LED灯; 1、本设计采用STM32F103C8T6单片机作为主控芯片; 2、实时显示:通过OLED液晶显示屏实时显示操作信息&#…

2026/9/26 3:33:38 阅读更多 →
RPA选型总烂尾?三大根源与泛微千里聆适用边界全解析

RPA选型总烂尾?三大根源与泛微千里聆适用边界全解析

先说我这些年在企业里看到的RPA项目,十个里有六七个是“选型那一刻就注定要烂尾”的。不是因为产品不行,而是很多企业把RPA选型当成了一次普通软件采购——看演示、比价格、谈商务,却完全没想清楚自己要解决什么问题、现有系统长什么样、未来…

2026/9/26 3:33:38 阅读更多 →

最新新闻

基于卷积神经网络(CNN)的个性化定制表情系统的设计与实现机器学习实战项目python数据分析与可视化

基于卷积神经网络(CNN)的个性化定制表情系统的设计与实现机器学习实战项目python数据分析与可视化

✅源码获取: 🍅--------------------【点击左上方头像,在置顶文章上方的wx】联系我们-------------🍅✌网站介绍:✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。✌服务范围:大数据、机器学习…

2026/9/26 4:14:00 阅读更多 →
AI检测在线免费接口批量调用踩坑,我把流水线返工了3次

AI检测在线免费接口批量调用踩坑,我把流水线返工了3次

上周三凌晨两点我对着流水线的红色报错页面,差点把机械键盘敲出键程异响。当时为了赶内容合规的自动化流程,图省事接入了AI检测在线免费的能力,结果没捋清楚细节直接上线,连着踩了三波坑,返工三次才跑通。我们组Q3接了…

2026/9/26 4:14:00 阅读更多 →
2026查重工具排行实测踩坑:千万级文本库校验的性能坑点梳理

2026查重工具排行实测踩坑:千万级文本库校验的性能坑点梳理

上周运营妹子甩给我一张Excel表,说要做公司内容合规系统的底层校验模块,让我别光信网上传的2026查重工具排行,自己测了再上线。本来一开始我以为照着公开的参数拼几个主流接口,一周就能交付,结果头天测就给我整出个生产…

2026/9/26 4:14:00 阅读更多 →
.NET桌面程序部署:Windows Desktop Runtime版本匹配与离线安装实战

.NET桌面程序部署:Windows Desktop Runtime版本匹配与离线安装实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 4:14:00 阅读更多 →
S5 传感器+视觉系统集成实战:触发链路、时序预算与联合调试

S5 传感器+视觉系统集成实战:触发链路、时序预算与联合调试

S5 传感器视觉系统集成实战:触发链路、时序预算与联合调试 一、为什么零件都选对了,系统还是不稳 先看三个我真实遇到的现场:传感器型号、相机、光源全都按选型手册挑的,参数表一对全在规格内,但产线就是跑不顺。 现…

2026/9/26 4:14:00 阅读更多 →
团队会议录音工具盘点:文件共享与协同功能有哪些

团队会议录音工具盘点:文件共享与协同功能有哪些

不少团队在多人会议后,经常遇到音频分散在不同设备、转写文稿各自保存、后续多人整理时版本混乱的情况。不同场景下的录音工具,在文件共享与协同能力上存在明显差异。核心协同相关能力梳理不同工具在团队协作环节的能力边界各有不同,可通过基…

2026/9/26 4:12:59 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →