618 大促技术实践:定时任务异常重试的探索与沉淀​

news/2026/1/21 19:08:26/文章来源:https://www.cnblogs.com/Jcloud/p/19513733

在 618 大促的技术战场上,每一行代码、每一个配置都影响着一线的实实在在的业务。一次看似平常的发版,却意外暴露了我们系统中的定时任务管理短板,这促使我们深入剖析分布式任务调度中异常重试机制的技术细节,并最终将其转化为守护系统稳定性的坚固防线。​

一、异常事件回溯:隐藏在发版背后的定时炸弹​

发版次日,业务部门反馈商家未收到门店收货明细邮件,导致门店收货业务收到影响。技术团队迅速启动应急流程,通过全链路日志追踪和系统状态分析,发现了问题的根源是:发版过程中,由于服务重启,中断了定时任务进程,正在执行的邮件发送任务被意外终止。而该任务在管理平台上并未配置任何重试策略,业务代码上也没有进行相关的检测和重试,这就导致任务失败后无法自动恢复执行,也未被及时感知到,进而引发业务阻断。​

为解决燃眉之急,研发人员立即登录任务管理平台,手工触发邮件发送任务,确保业务及时恢复。但这次事件给我们敲响了警钟:在分布式任务调度场景下,面对网络抖动、进程异常终止等场景,异常重试机制是保障业务可靠性的关键。​

二、重试策略设计:从理论到代码的深度解析​

2.1 验证EasyJob的重试策略

在复盘问题的过程中,我们发现了EasyJob分布式任务是具有重试策略的,只是默认不开启,而不是默认开启。

 


 

该策略以三个核心参数为基础:首次重试间隔时间 F、重试间隔乘数 M 和最大重试次数 C。

通过这三个参数的组合,我们可以灵活控制任务重试节奏,平衡系统负载与任务恢复效率。​

例如:配置t=10s, M=2, C=10,则间隔时间依次是:

 间隔时间计算方式间隔时间结果
1 10s(初始间隔,无计算) 10s
2 10s×2 20s
3 20s×2 40s
4 40s×2 80s
5 80s×2 160s

验证日志:

21:45:29.990 [main-schedule-worker-pool-1-thread-1] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:45:40.204 [main-schedule-worker-pool-1-thread-2] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:46:00.674 [main-schedule-worker-pool-1-thread-3] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:46:41.749 [main-schedule-worker-pool-1-thread-4] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:48:02.398 [main-schedule-worker-pool-1-thread-5] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:50:43.008 [main-schedule-worker-pool-1-thread-1] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
任务序号开始时间与前一任务的间隔
第 1 个任务 21:45:29.990 -
第 2 个任务 21:45:40.204 10.214 秒
第 3 个任务 21:46:00.674 20.47 秒
第 4 个任务 21:46:41.749 41.075 秒
第 5 个任务 21:48:02.398 80.649 秒(约 1 分 20.65 秒)
第 6 个任务 21:50:43.008 160.61 秒(约 2 分 40.61 秒)

与上面计算的一致。

验证方案:

1、实现接口:com.wangyin.schedule.client.job.ScheduleFlowTask,并设置任务返回失败:

 


 

2、创建CRON触发器

 


 

3、设置自动重试参数

 


 

 


 

4、暂停任务并手工触发一次

 


 

2.2 实现一个简单的重试策略

根据上述策略,简单实现了一个灵活可配置的任务重试机制。

public class TaskRetryExecutor {@Getterprivate final ScheduledExecutorService executor = newScheduledThreadPool(10);private final long firstRetryInterval;private final int intervalMultiplier;private final int maxRetryCount;public TaskRetryExecutor(long firstRetryInterval, int intervalMultiplier, int maxRetryCount) {this.firstRetryInterval = firstRetryInterval;this.intervalMultiplier = intervalMultiplier;this.maxRetryCount = maxRetryCount;}public void submitRetryableTask(Runnable task) {executeWithRetry(task, 1);}private void executeWithRetry(Runnable task, int currentRetryCount) {executor.schedule(() -> {try {task.run();log.info("任务在第{}次尝试时成功执行", currentRetryCount);} catch (Exception e) {log.error("任务在第{}次尝试时执行失败", currentRetryCount, e);if (currentRetryCount <= maxRetryCount) {long delay = calculateRetryDelay(currentRetryCount);log.info("计划在{}毫秒后进行第{}次重试", delay, currentRetryCount);executeWithRetry(task, currentRetryCount + 1);} else {log.error("超过最大重试次数。任务执行最终失败。");}}}, currentRetryCount ==1?0:calculateRetryDelay(currentRetryCount),TimeUnit.MILLISECONDS);}publiclongcalculateRetryDelay(int retryCount){if(retryCount ==1){return firstRetryInterval;}elseif(retryCount >1&& retryCount <= maxRetryCount){long previousDelay =calculateRetryDelay(retryCount -1);return previousDelay * intervalMultiplier;}return-1;// 超出最大重试次数,返回错误标识}}

​在上述代码中:

1.TaskRetryExecutor类封装了任务重试的核心逻辑。构造函数接收三个关键参数:firstRetryInterval、intervalMultiplier和maxRetryCount,用于配置重试策略,对应于EasyJob的F、M、C参数。
2.submitRetryableTask方法接收一个可执行任务,并启动重试流程。它调用executeWithRetry方法,初始重试次数为1。
3.executeWithRetry方法是重试逻辑的核心。它使用ScheduledExecutorService来调度任务执行:
如果任务执行成功,记录成功日志。
•如果任务执行失败且未超过最大重试次数,计算下一次重试的延迟时间,并递归调用自身进行重试。
•如果超过最大重试次数,记录最终失败日志。
4.calculateRetryDelay方法实现了重试间隔的计算规则:
第一次重试使用firstRetryInterval。
之后的重试间隔是前一次间隔乘以intervalMultiplier。
如果超出最大重试次数,返回-1表示错误。

通过这种设计,我们实现了一个可复用、可配置的任务重试机制。它能够根据配置的参数自动调整重试间隔,在任务失败时进行有策略的重试,同时避免无限重试导致的资源浪费。

详细代码可在以下Git仓库中找到:git@coding.jd.com:newJavaEngineerOrientation/TaskRetryStrategies.git

2.3 重试策略的理论分析

2.3.1 EasyJob对乘数和最大重试次数的限制

在对EasyJob也进行了重试的验证中发现:

1.每次重做的乘数取值范围是[1,8],可以是具有一位小数位的浮点数,比如3.5,
2.最多重做次数是[1,16]间的整数,第一次重试的间隔没有限制,单位是秒。

 


 

2.3.2 梯度分析

通过上面的验证和重试相关概念的定义,可以得到:第n次重试的间隔时间=第一次间隔时间*乘数^(n-1),即:

 

其中:

 


 

对乘数M的梯度:

 


 

对重试次数n的梯度:

 


 

详细推导: http://xingyun.jd.com/codingRoot/newJavaEngineerOrientation/TaskRetryStrategies/blob/master/src/main/resources/%E5%85%AC%E5%BC%8F%E6%8E%A8%E5%AF%BC.md

从下图可以看出,重试次数n较大时(比如8),乘数 M 的细微变化都会导致,任务的间隔时间发生剧烈变化,因此n超过8之后,M基本不可调。

 


 

同样的,从下图可以看到,乘数M较大时(比如4),n的细微变化也会导致任务的间隔时间爆发式的增加。

 


 

1、乘数在1.5-4 的合理性

过小乘数 (<1.5) 的问题:

当乘数 = 1.2,重试 10 次的间隔时间是:1次:1, 2次:1.2, 3次:1.44, ..., 10次:5.16,

10 次重试总间隔仅 5 倍,接近固定间隔,可能导致 "惊群效应"(大量请求同时重试)。

过大乘数 (>4) 的问题

当乘数 = 8,重试 5 次的间隔时间:1次:1, 2次:8, 3次:64, 4次:512, 5次:4096

5 次重试后间隔已超 1 小时(假设初始间隔时间是最小的1s,4096s>1小时),可能导致请求长时间等待,用户体验差。

因此,乘数 = 1.5-4 在 "退避效率" 和 "资源消耗" 间取得平衡,一般取乘数= 2 (标准指数退避)。

行业实践:AWS SDK 默认乘数 = 2,Google gRPC 重试策略推荐乘数 = 1.5-3,多数 HTTP 客户端库 (如 requests) 默认乘数 = 2。

2、最大重试次数3-10的合理性

假设单次重试成功概率为P(比如网络/服务临时故障,重试成功概率通常较高),重试 n次至少成功 1 次的概率为:

 


 

p=0.5,(单次重试 50% 成功概率):

n=3 时,成功概率 =1−(0.5)^3=87.5%

n=5 时,成功概率 =1−(0.5)^5=96.875%

n=10 时,成功概率 =1−(0.5)^10≈99.9%

实际场景中,临时故障的单次成功概率远高于 50%(比如网络抖动重试成功概率可能达 80%)

若 p=0.8,n=3时成功概率已达 1−0.2^3=99.2%几乎覆盖所有临时故障。

因此,3 - 10 次重试,能以极高概率(99%+)覆盖“临时故障”场景,再增加次数对成功概率提升极有限(边际效应递减)。

因为已知的任务延迟时间的公式是:

 

n从1到C进行累加得到总耗时:

 

根据等比数列求和公式可以得到:

 

M=2(常用乘数),F=1 秒(最小可能值):

n=3时,T=(2^3-1)/(2-1)=7秒

n=5时,T=(2^5-1)/(2-1)=31秒

n=10时,T=2^10-1=1023秒≈17分钟

n=13时,T=2^13-1≈2.3小时

n=15时,T=2^15-1≈9.1小时

当n超过10后,每次增加都会导致总耗时急剧增长,很容易超过业务的容忍上限(具体业务具体分析),也可能因为重试过多,导致被调用的系统压力增加,甚至造成系统崩溃。

故:3 - 10 次重试可将总耗时控制在“业务可接受范围”(几秒到十几分钟),同时避免资源过载。

行业实践:Kafka 消费者重试:默认 10 次、Redis 客户端重试:默认 5 次、Hadoop 任务重试:默认 3-5 次、RFC 建议:RFC 6582(HTTP 重试)建议:3-5 次重试。

3、最佳实践速查表

参数短期任务(分钟级)中期任务(小时级)长期任务(天级)
乘数 2 2 1.75
重试次数 3 - 5 5 - 8 8 - 12
初始间隔(秒) 1 - 5 30 - 60 300 - 600
总耗时范围 <60秒 5 - 10分钟 1 - 2小时
适用场景 临时网络波动 服务重启、发版 服务短暂过载 资源密集型操作

三、经验沉淀:异常重试机制的设计原则​

通过这次实践和对行业方案的研究,我们总结出异常重试机制设计的四大核心原则:​

1.动态适应性原则:重试策略应支持参数化配置,根据业务场景和系统负载动态调整重试间隔和次数,避免 “一刀切” 的重试策略对系统造成冲击。​
2.幂等性保障原则:确保任务在多次重试过程中不会产生重复数据或副作用,通过唯一标识、状态机等技术手段,实现任务的幂等执行。​
3.故障隔离原则:将重试逻辑与业务逻辑分离,通过消息队列、异步调度等方式,降低重试操作对主线程的影响,避免因重试失败导致系统整体崩溃。​
4.可观测性原则:建立完善的监控和告警体系,实时追踪任务重试状态,在达到最大重试次数时及时发出告警,便于运维人员快速定位和解决问题。​

四、结语:以技术沉淀筑牢大促防线​

这次线上异常事件,犹如一面镜子,让我们清晰地看到了系统中的潜在风险,也为我们提供了一次宝贵的技术提升机会。通过对异常重试机制的深入研究和实践,我们不仅解决了当前问题,更将这些经验转化为团队的技术资产。在未来的 618 大促及其他关键业务场景中,我们将以更完善的技术方案、更严谨的设计原则,守护系统的稳定运行,为业务发展提供坚实的技术保障。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1195978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026执业中药师备考资料看什么?高分考生口碑推荐的五大资源盘点!

2026执业中药师备考资料看什么?高分考生口碑推荐的五大资源盘点!一、 开篇:向高分通过者取经,揭秘高效备考资料在执业中药师备考路上,最宝贵的经验往往来自那些已经成功通关的高分考生。他们的选择,经历了实战检…

专著参编证明怎么开?

专著参编证明怎么开&#xff1f;专著主编、副主编的参编证明模版是怎样的&#xff1f;下面淘淘学术来给大家讲解这个疑问。一、什么情况下需要提供参编证明在评职称的时候&#xff0c;如果出版了专著&#xff0c;那么一般会要求提供相关的证明材料。1如果是独著或者合著的专著&…

深圳百度推广代运营排名前十机构怎么选?昊客网络用技术实力说话!

在深圳这座互联网营销热土上,百度竞价推广早已成为企业获客的核心渠道。面对市面上宣称 “排名前十” 的众多代运营服务商,企业该如何避开 “烧钱不转化” 的坑?其实答案很简单:技术硬、效果实、懂行业的服务商才值…

专著和著作的区别有哪些?

专著和著作的区别有哪些&#xff1f;专著和著作是一回事吗&#xff1f;下面淘淘学术来回答作者的这个疑问。一、专著和著作的定义著作独立的完整性的作品&#xff0c;称之为著作。著作包括&#xff1a;1文字作品&#xff1a;比如小说、散文、随笔、回忆录、人物传记、剧本、学术…

智能混动越野房车:STM32N657L0H3Q

品牌&#xff1a;ST型号&#xff1a;STM32N657L0H3Q容量&#xff1a;4.2MBCPU位数&#xff1a;32 Bit产品类型&#xff1a;单片机(MCU/MPU/SOC)工作电压&#xff1a;1.71V~3.6V封装&#xff1a;BGA-223(10x10)免费样品申请&#xff1a;中国区一级代理商&#xff1a;深圳市贝乐实…

学习进度 5

刚学完机器学习基础,今天试着入门CNN,它主要用来处理图像。作为纯新手,第一天就想大概懂CNN为啥适合图像处理、核心有哪几层,再跟着跑个demo就行,不深究原理。之前学的全连接网络处理图像会浪费像素位置关系,参数…

怎么提高专著的含金量?

怎么提高专著的含金量&#xff1f;怎么出版高质量的学术专著&#xff1f;下面淘淘学术来回答作者的这个疑问。淘淘学术经常会遇到一些作者&#xff0c;他们是完美主义者&#xff0c;或者说是卷王&#xff0c;干什么都要比别人高一档才行。别人发SCI二区论文&#xff0c;他就非得…

基于知识工程JoyAgent双RAG的智能代码评审系统的探索与实践

大促备战中的代码评审困境与破局双十一大促是系统稳定性的终极“大考”。为规避上线风险,技术侧会启动系统封板管控,主动将非紧急需求的发布窗口前置。这一举措在保障系统稳定性的同时,也必然导致研发需求的前置与集…

外贸企业注意!2026年外贸GEO国际社媒推广代运营,这10家深圳公司谁更靠谱?

关键词:外贸出海、GEO精准营销、社媒代运营、深圳服务商、AI营销 2026年开年,不少外贸老板都在问同一个问题: “投了大把广告费,为什么海外客户还是不来?” 独立站没人访问?Facebook内容发了石沉大海?Google关键…

基于yolov8的夜间车辆检测识别系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的夜间车辆检测识别系统是一种融合深度学习与智能视觉分析技术的自动化监控工具&#xff0c;专为低光照环境下的车辆精准识别与行为分析设计。该系统通过YOLOv8目标检测算法&#xff0c;对夜间道路监控图像或车载摄像头视频流进行实时解析&#xff0c;…

广州专业展览公司有哪些?2026这份实力盘点教你避开“展台设计搭建陷阱”

广州专业展览公司很难找?2026这份实力盘点教你避开“展台设计搭建陷阱” 当您开始为2026年在广州举办的各类重磅专业展会(如广交会、广州国际照明展、家博会等)筹备参展计划时,一个决定参展投资回报率的核心问题便浮…

深圳科心大心理咨询多少钱 无隐形消费 收费透明

心理健康需求攀升,收费合理性与透明度成选机构关键。深圳科心大心理咨询是深圳市卫健委审批的正规双资质医疗专科,诊疗专业且收费规范透明,无隐形消费,为市民提供安心服务。统一定价,分级适配需求 科心大各项收费…

【Linux】进程概念 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深圳昊客网络|外贸社媒GEO推广代运营公司/服务商:排名前十机构哪好点?

在全球贸易加速数字化的2026年,深圳这座“外贸第一城”正迎来新一轮洗牌。据深圳海关最新数据,全市外贸企业已突破15万家,但超六成中小企业仍深陷“高投入、低转化”的推广困局——独立站无人问津、谷歌关键词排名遥…

收藏必备!大模型知识蒸馏技术调研:黑盒、白盒与混合方法全解析

文章调研了大模型知识蒸馏近年工作&#xff0c;分为黑盒和白盒两种类型。黑盒蒸馏在工业界应用更广&#xff0c;白盒蒸馏在学术界研究较多。文章介绍了代表性文献&#xff0c;包括DeepSeek-R1、MiniPLM等黑盒方法&#xff0c;以及DistilQwen2.5等黑白盒结合方法&#xff0c;并讨…

LangChain多智能体架构全解析:5种模式实战+收藏级代码实现

本文详解LangChain多智能体系统架构&#xff0c;介绍Subagents、Handoffs、Skills、Router和Custom workflow五种实现模式&#xff0c;并通过搜索智能体案例展示两种实际应用方案。多智能体系统通过群体智能突破单智能体能力边界&#xff0c;适合复杂、动态、大规模任务场景&am…

热销榜单:2026年高口碑企业加密软件评测公司口碑排行榜单,数据防泄露系统机构推荐

在2026年的企业加密软件评测中,各家公司以其卓越的服务和产品质量脱颖而出,形成了较为明显的口碑差距。评测依据包括易用性、安全性及用户反馈等多个维度,整体展示了各大公司的综合实力和市场表现。例如,中安网脉(…

2026年腐殖酸钾优质厂家推荐指南适配多场景

2026年腐殖酸钾优质厂家推荐指南 一、行业背景与筛选依据 据《2025-2030年中国腐殖酸肥料行业发展白皮书》数据,国内腐殖酸肥料市场年复合增长率达8.2%,其中腐殖酸钾因兼具养分补给与土壤调控功能,市场需求占比提升…

TDengine 字符串函数 GROUP_CONCAT 用户手册 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

亚马逊、敦煌网商家突围必备!自养号测评补单提升店铺排名销量秘籍

在跨境电商领域&#xff0c;otto、wayfair、亚马逊、速卖通、阿里国际站、敦煌网、虾皮、lazada、美客多等平台已然成为众多卖家逐鹿的战场。在这些平台上&#xff0c;产品的排名与销量&#xff0c;就如同企业的生命线&#xff0c;直接决定着卖家在全球市场中的竞争力与盈利水平…