chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

618 大促技術實踐:定時任務異常重試的探索與沉淀?

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2026-01-21 18:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在 618 大促的技術戰(zhàn)場上,每一行代碼、每一個配置都影響著一線的實實在在的業(yè)務。一次看似平常的發(fā)版,卻意外暴露了我們系統(tǒng)中的定時任務管理短板,這促使我們深入剖析分布式任務調(diào)度中異常重試機制的技術細節(jié),并最終將其轉化為守護系統(tǒng)穩(wěn)定性的堅固防線。?

一、異常事件回溯:隱藏在發(fā)版背后的定時炸彈?

發(fā)版次日,業(yè)務部門反饋商家未收到門店收貨明細郵件,導致門店收貨業(yè)務收到影響。技術團隊迅速啟動應急流程,通過全鏈路日志追蹤和系統(tǒng)狀態(tài)分析,發(fā)現(xiàn)了問題的根源是:發(fā)版過程中,由于服務重啟,中斷了定時任務進程,正在執(zhí)行的郵件發(fā)送任務被意外終止。而該任務在管理平臺上并未配置任何重試策略,業(yè)務代碼上也沒有進行相關的檢測和重試,這就導致任務失敗后無法自動恢復執(zhí)行,也未被及時感知到,進而引發(fā)業(yè)務阻斷。?

為解決燃眉之急,研發(fā)人員立即登錄任務管理平臺,手工觸發(fā)郵件發(fā)送任務,確保業(yè)務及時恢復。但這次事件給我們敲響了警鐘:在分布式任務調(diào)度場景下,面對網(wǎng)絡抖動、進程異常終止等場景,異常重試機制是保障業(yè)務可靠性的關鍵。?

二、重試策略設計:從理論到代碼的深度解析?

2.1 驗證EasyJob的重試策略

在復盤問題的過程中,我們發(fā)現(xiàn)了EasyJob分布式任務是具有重試策略的,只是默認不開啟,而不是默認開啟。

wKgZO2lwqcuAOeQiAACLF2v3JKk941.png

該策略以三個核心參數(shù)為基礎:首次重試間隔時間 F、重試間隔乘數(shù) M 和最大重試次數(shù) C。

通過這三個參數(shù)的組合,我們可以靈活控制任務重試節(jié)奏,平衡系統(tǒng)負載與任務恢復效率。?

例如:配置t=10s, M=2, C=10,則間隔時間依次是:

重試次數(shù) nn 間隔時間計算方式 間隔時間結果
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 - 開始執(zhí)行發(fā)送郵件任務
21:45:40.204 [main-schedule-worker-pool-1-thread-2] INFO  cn.jdl.tech_and_data.EmailSendingTask - 開始執(zhí)行發(fā)送郵件任務
21:46:00.674 [main-schedule-worker-pool-1-thread-3] INFO  cn.jdl.tech_and_data.EmailSendingTask - 開始執(zhí)行發(fā)送郵件任務
21:46:41.749 [main-schedule-worker-pool-1-thread-4] INFO  cn.jdl.tech_and_data.EmailSendingTask - 開始執(zhí)行發(fā)送郵件任務
21:48:02.398 [main-schedule-worker-pool-1-thread-5] INFO  cn.jdl.tech_and_data.EmailSendingTask - 開始執(zhí)行發(fā)送郵件任務
21:50:43.008 [main-schedule-worker-pool-1-thread-1] INFO  cn.jdl.tech_and_data.EmailSendingTask - 開始執(zhí)行發(fā)送郵件任務

任務序號 開始時間 與前一任務的間隔
第 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、實現(xiàn)接口:com.wangyin.schedule.client.job.ScheduleFlowTask,并設置任務返回失?。?/p>

wKgZPGlwqcuAYwaiAAGTTki-K70246.png

2、創(chuàng)建CRON觸發(fā)器

wKgZO2lwqcyAVRahAAFPmAjiAOE268.png

3、設置自動重試參數(shù)

wKgZPGlwqc2AYCZRAAFmPUXhWK8032.png

wKgZO2lwqc2ATNlwAABR8kEQqoU722.png

4、暫停任務并手工觸發(fā)一次

wKgZPGlwqc6AdvOIAADkMSutJ5E726.png

2.2 實現(xiàn)一個簡單的重試策略

根據(jù)上述策略,簡單實現(xiàn)了一個靈活可配置的任務重試機制。

public class TaskRetryExecutor {
    @Getter
    private 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("任務在第{}次嘗試時成功執(zhí)行", currentRetryCount);
            } catch (Exception e) {
                log.error("任務在第{}次嘗試時執(zhí)行失敗", currentRetryCount, e);
                if (currentRetryCount <= maxRetryCount) {
                    long delay = calculateRetryDelay(currentRetryCount);
                    log.info("計劃在{}毫秒后進行第{}次重試", delay, currentRetryCount);
                    executeWithRetry(task, currentRetryCount + 1);
                } else {
                    log.error("超過最大重試次數(shù)。任務執(zhí)行最終失敗。");
                }
            }
        }, currentRetryCount == 1 ? 0 : calculateRetryDelay(currentRetryCount), TimeUnit.MILLISECONDS);
    }

    public long calculateRetryDelay(int retryCount) {
        if (retryCount == 1) {
            return firstRetryInterval;
        } else if (retryCount > 1 && retryCount <= maxRetryCount) {
            long previousDelay = calculateRetryDelay(retryCount - 1);
            return previousDelay * intervalMultiplier;
        }
        return -1; // 超出最大重試次數(shù),返回錯誤標識
    }
}

?在上述代碼中:

1.TaskRetryExecutor類封裝了任務重試的核心邏輯。構造函數(shù)接收三個關鍵參數(shù):firstRetryInterval、intervalMultiplier和maxRetryCount,用于配置重試策略,對應于EasyJob的F、M、C參數(shù)。

2.submitRetryableTask方法接收一個可執(zhí)行任務,并啟動重試流程。它調(diào)用executeWithRetry方法,初始重試次數(shù)為1。

3.executeWithRetry方法是重試邏輯的核心。它使用ScheduledExecutorService來調(diào)度任務執(zhí)行:

?如果任務執(zhí)行成功,記錄成功日志。

??如果任務執(zhí)行失敗且未超過最大重試次數(shù),計算下一次重試的延遲時間,并遞歸調(diào)用自身進行重試。

??如果超過最大重試次數(shù),記錄最終失敗日志。

4.calculateRetryDelay方法實現(xiàn)了重試間隔的計算規(guī)則:

?第一次重試使用firstRetryInterval。

?之后的重試間隔是前一次間隔乘以intervalMultiplier。

?如果超出最大重試次數(shù),返回-1表示錯誤。

通過這種設計,我們實現(xiàn)了一個可復用、可配置的任務重試機制。它能夠根據(jù)配置的參數(shù)自動調(diào)整重試間隔,在任務失敗時進行有策略的重試,同時避免無限重試導致的資源浪費。

詳細代碼可在以下Git倉庫中找到:git@coding.jd.com:newJavaEngineerOrientation/TaskRetryStrategies.git

2.3 重試策略的理論分析

2.3.1 EasyJob對乘數(shù)和最大重試次數(shù)的限制

在對EasyJob也進行了重試的驗證中發(fā)現(xiàn):

1.每次重做的乘數(shù)取值范圍是[1,8],可以是具有一位小數(shù)位的浮點數(shù),比如3.5,

2.最多重做次數(shù)是[1,16]間的整數(shù),第一次重試的間隔沒有限制,單位是秒。

wKgZO2lwqc-ACO7aAABJAe65RVI089.png

2.3.2 梯度分析

通過上面的驗證和重試相關概念的定義,可以得到:第n次重試的間隔時間=第一次間隔時間*乘數(shù)^(n-1),即:

wKgZPGlwqc-AOcT4AAATC_QVeIE117.png

其中:

wKgZO2lwqdCAJ3QSAACjMe7lY8o552.png

對乘數(shù)M的梯度:

wKgZPGlwqdCAKFRdAAA2xLbEicA973.png

對重試次數(shù)n的梯度:

wKgZO2lwqdGAeJ3-AAAyy_Tn6xM481.png

詳細推導: 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

從下圖可以看出,重試次數(shù)n較大時(比如8),乘數(shù) M 的細微變化都會導致,任務的間隔時間發(fā)生劇烈變化,因此n超過8之后,M基本不可調(diào)。

wKgZPGlwqdOAfPd0AAfL8Q9I66g443.png

同樣的,從下圖可以看到,乘數(shù)M較大時(比如4),n的細微變化也會導致任務的間隔時間爆發(fā)式的增加。

wKgZO2lwqdWAfPmvAAgnK_L1TwE785.png

1、乘數(shù)在1.5-4 的合理性

過小乘數(shù) (<1.5) 的問題:

當乘數(shù) = 1.2,重試 10 次的間隔時間是:1次:1, 2次:1.2, 3次:1.44, ..., 10次:5.16,

10 次重試總間隔僅 5 倍,接近固定間隔,可能導致 "驚群效應"(大量請求同時重試)。

過大乘數(shù) (>4) 的問題

當乘數(shù) = 8,重試 5 次的間隔時間:1次:1, 2次:8, 3次:64, 4次:512, 5次:4096

5 次重試后間隔已超 1 小時(假設初始間隔時間是最小的1s,4096s>1小時),可能導致請求長時間等待,用戶體驗差。

因此,乘數(shù) = 1.5-4 在 "退避效率" 和 "資源消耗" 間取得平衡,一般取乘數(shù)= 2 (標準指數(shù)退避)。

行業(yè)實踐:AWS SDK 默認乘數(shù) = 2,Google gRPC 重試策略推薦乘數(shù) = 1.5-3,多數(shù) HTTP 客戶端庫 (如 requests) 默認乘數(shù) = 2。

2、最大重試次數(shù)3-10的合理性

假設單次重試成功概率為P(比如網(wǎng)絡/服務臨時故障,重試成功概率通常較高),重試 n次至少成功 1 次的概率為:

wKgZPGlwqdaARJINAAA9Slly32Q913.png

當 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%(比如網(wǎng)絡抖動重試成功概率可能達 80%)

若 p=0.8,n=3時成功概率已達 1?0.2^3=99.2%幾乎覆蓋所有臨時故障。

因此,3 - 10 次重試,能以極高概率(99%+)覆蓋“臨時故障”場景,再增加次數(shù)對成功概率提升極有限(邊際效應遞減)。

因為已知的任務延遲時間的公式是:

wKgZPGlwqc-AOcT4AAATC_QVeIE117.png

,

n從1到C進行累加得到總耗時:

wKgZPGlwqdaAeXU-AAAqYzvPZZU546.png

根據(jù)等比數(shù)列求和公式可以得到:

wKgZO2lwqdeAFbzIAAAh_MoiqEI357.png

令 M=2(常用乘數(shù)),F(xiàn)=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后,每次增加都會導致總耗時急劇增長,很容易超過業(yè)務的容忍上限(具體業(yè)務具體分析),也可能因為重試過多,導致被調(diào)用的系統(tǒng)壓力增加,甚至造成系統(tǒng)崩潰。

故:3 - 10 次重試可將總耗時控制在“業(yè)務可接受范圍”(幾秒到十幾分鐘),同時避免資源過載。

行業(yè)實踐:Kafka 消費者重試:默認 10 次、Redis 客戶端重試:默認 5 次、Hadoop 任務重試:默認 3-5 次、RFC 建議:RFC 6582(HTTP 重試)建議:3-5 次重試。

3、最佳實踐速查表

參數(shù) 短期任務(分鐘級) 中期任務(小時級) 長期任務(天級)
乘數(shù) 2 2 1.75
重試次數(shù) 3 - 5 5 - 8 8 - 12
初始間隔(秒) 1 - 5 30 - 60 300 - 600
總耗時范圍 <60秒 5 - 10分鐘 1 - 2小時
適用場景 臨時網(wǎng)絡波動 服務重啟、發(fā)版 服務短暫過載 資源密集型操作

三、經(jīng)驗沉淀:異常重試機制的設計原則?

通過這次實踐和對行業(yè)方案的研究,我們總結出異常重試機制設計的四大核心原則:?

1.動態(tài)適應性原則:重試策略應支持參數(shù)化配置,根據(jù)業(yè)務場景和系統(tǒng)負載動態(tài)調(diào)整重試間隔和次數(shù),避免 “一刀切” 的重試策略對系統(tǒng)造成沖擊。?

2.冪等性保障原則:確保任務在多次重試過程中不會產(chǎn)生重復數(shù)據(jù)或副作用,通過唯一標識、狀態(tài)機等技術手段,實現(xiàn)任務的冪等執(zhí)行。?

3.故障隔離原則:將重試邏輯與業(yè)務邏輯分離,通過消息隊列、異步調(diào)度等方式,降低重試操作對主線程的影響,避免因重試失敗導致系統(tǒng)整體崩潰。?

4.可觀測性原則:建立完善的監(jiān)控和告警體系,實時追蹤任務重試狀態(tài),在達到最大重試次數(shù)時及時發(fā)出告警,便于運維人員快速定位和解決問題。?

四、結語:以技術沉淀筑牢大促防線?

這次線上異常事件,猶如一面鏡子,讓我們清晰地看到了系統(tǒng)中的潛在風險,也為我們提供了一次寶貴的技術提升機會。通過對異常重試機制的深入研究和實踐,我們不僅解決了當前問題,更將這些經(jīng)驗轉化為團隊的技術資產(chǎn)。在未來的 618 大促及其他關鍵業(yè)務場景中,我們將以更完善的技術方案、更嚴謹?shù)脑O計原則,守護系統(tǒng)的穩(wěn)定運行,為業(yè)務發(fā)展提供堅實的技術保障。

?審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 分布式
    +關注

    關注

    1

    文章

    1089

    瀏覽量

    76565
  • 任務調(diào)度

    關注

    0

    文章

    28

    瀏覽量

    10199
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于知識工程JoyAgent雙RAG的智能代碼評審系統(tǒng)的探索實踐

    備戰(zhàn)中的代碼評審困境與破局 雙十一大是系統(tǒng)穩(wěn)定性的終極“大考”。為規(guī)避上線風險,技術側會啟動系統(tǒng)封板管控,主動將非緊急需求的發(fā)布窗口前置。這一舉措在保障系統(tǒng)穩(wěn)定性的同時,也必然導致研發(fā)需求
    的頭像 發(fā)表于 01-21 18:26 ?1979次閱讀
    基于知識工程JoyAgent雙RAG的智能代碼評審系統(tǒng)的<b class='flag-5'>探索</b>與<b class='flag-5'>實踐</b>

    基于知識工程&amp;JoyAgent雙RAG的智能代碼評審系統(tǒng)的探索實踐

    備戰(zhàn)中的代碼評審困境與破局 雙十一大是系統(tǒng)穩(wěn)定性的終極“大考”。為規(guī)避上線風險,技術側會啟動系統(tǒng)封板管控,主動將非緊急需求的發(fā)布窗口前置。這一舉措在保障系統(tǒng)穩(wěn)定性的同時,也必然導致研發(fā)需求
    的頭像 發(fā)表于 01-15 15:12 ?171次閱讀
    基于知識工程&amp;JoyAgent雙RAG的智能代碼評審系統(tǒng)的<b class='flag-5'>探索</b>與<b class='flag-5'>實踐</b>

    探索HMC618ALP3E:高性能低噪聲放大器的卓越之選

    探索HMC618ALP3E:高性能低噪聲放大器的卓越之選 在電子設備的設計中,低噪聲放大器(LNA)扮演著至關重要的角色,尤其是在對信號質(zhì)量要求極高的無線通信領域。今天,我們就來深入了解一款出色
    的頭像 發(fā)表于 01-04 14:40 ?181次閱讀

    Crontab定時任務完全指南

    在凌晨3點,當大多數(shù)人還在熟睡時,一位運維工程師的手機突然響起——線上數(shù)據(jù)庫備份失敗了。他匆忙起床,打開電腦,手動執(zhí)行備份腳本,整個過程耗時2小時。這樣的場景,在我剛入行時經(jīng)常遇到。直到我真正掌握了crontab定時任務,才徹底擺脫了"人肉運維"的窘境。
    的頭像 發(fā)表于 09-05 10:03 ?840次閱讀

    基于 AS32X601 微控制器的定時器模塊(TIM)技術研究與應用實踐

    摘要: 本文全面介紹了國科安芯推出的AS32X601系列微控制器的定時器模塊(TIM),包括其系統(tǒng)架構、功能特性、應用場景以及工程實踐要點。通過對芯片的詳細分析,揭示了其高性能運行的基礎。本文詳細
    的頭像 發(fā)表于 08-19 16:44 ?812次閱讀

    使用C#實現(xiàn)西門子PLC數(shù)據(jù)定時讀取保存

    在平時開發(fā)中,我們時常會遇到需要后臺靜默運行的應用場景,這些程序不需要用戶的直接操作或界面展示,而是專注于定時任務的執(zhí)行。比如說,我們需要定期從西門子PLC(可編程邏輯控制器)中讀取數(shù)據(jù)并進行保存,以便后續(xù)分析使用。
    的頭像 發(fā)表于 08-07 16:17 ?2447次閱讀
    使用C#實現(xiàn)西門子PLC數(shù)據(jù)<b class='flag-5'>定時</b>讀取保存

    618結束,安防攝像頭市場戰(zhàn)況何如?

    618活動結束,安防領域產(chǎn)品銷量增長。
    的頭像 發(fā)表于 06-30 17:21 ?966次閱讀

    商湯科技元蘿卜AI下棋機器人618回顧

    在剛剛落幕的2025年京東618中,元蘿卜交出了一份亮眼的成績單。
    的頭像 發(fā)表于 06-27 17:12 ?1450次閱讀

    機器學習異常檢測實戰(zhàn):用Isolation Forest快速構建無標簽異常檢測系統(tǒng)

    本文轉自:DeepHubIMBA無監(jiān)督異常檢測作為機器學習領域的重要分支,專門用于在缺乏標記數(shù)據(jù)的環(huán)境中識別異常事件。本文深入探討異常檢測技術的理論基礎與
    的頭像 發(fā)表于 06-24 11:40 ?1390次閱讀
    機器學習<b class='flag-5'>異常</b>檢測實戰(zhàn):用Isolation Forest快速構建無標簽<b class='flag-5'>異常</b>檢測系統(tǒng)

    德施曼618首戰(zhàn)全平臺銷額、銷量雙冠軍!京東天貓官榜第一!

    5月13日晚,各大電商618拉開序幕,相比往年再度提前。高端智能鎖領軍品牌德施曼現(xiàn)貨開售第一天勇奪全平臺智能鎖銷額&銷量雙冠軍!高端智能鎖銷額&銷量冠軍!其中,德施曼穩(wěn)居京東智能
    的頭像 發(fā)表于 06-19 12:32 ?883次閱讀
    德施曼<b class='flag-5'>618</b>首戰(zhàn)全平臺銷額、銷量雙冠軍!京東天貓官榜第一!

    HarmonyOS優(yōu)化應用文件上傳下載慢問題性能優(yōu)化一

    。調(diào)試模式可打印所有內(nèi)存修改、磁盤、網(wǎng)絡讀寫、邏輯分支等日志。發(fā)布模式下除了導致任務失敗、服務異常的日志,其余日志都會關閉。 任務失敗重試:對于不可恢復的原因,直接失?。粚τ诳苫謴偷脑?/div>
    發(fā)表于 05-26 15:50

    德施曼618首戰(zhàn)全平臺銷額、銷量雙冠軍!京東天貓官榜第一!

    5月13日晚,各大電商618拉開序幕,相比往年再度提前。高端智能鎖領軍品牌德施曼現(xiàn)貨開售第一天勇奪全平臺智能鎖銷額&銷量雙冠軍!高端智能鎖銷額&銷量冠軍!其中,德施曼穩(wěn)居京東智能
    的頭像 發(fā)表于 05-14 16:08 ?1580次閱讀
    德施曼<b class='flag-5'>618</b>首戰(zhàn)全平臺銷額、銷量雙冠軍!京東天貓官榜第一!

    555定時器設計異常現(xiàn)象

    課程需要搭建一個555定時器電路,使用的eda工具是Cadence Spectre ic618,其中比較器和RS鎖存器以及其他邏輯電路均為cmos電路,而放電管為bjt,現(xiàn)在進行直流仿真后發(fā)現(xiàn)vdd
    發(fā)表于 04-12 00:25

    linux服務器挖礦病毒處理方案

    情況說明:挖礦進程被隱藏(CPU占用50%,htop/top卻看不到異常進程),結束挖礦進程后馬上又會運行起來(crontab -l查看發(fā)現(xiàn)沒有定時任務)。
    的頭像 發(fā)表于 04-09 10:33 ?1171次閱讀
    linux服務器挖礦病毒處理方案

    【第四章 定時任務】手把手教你玩轉新版正點原子云

    【第四章 定時任務】手把手教你玩轉新版正點原子云 承接上篇,除了報警聯(lián)動這個功能,原子云還有一個特色功能也是各開發(fā)者喜歡用的,定時任務功能。 【正點原子】云平臺:原子云(點擊登錄原子云) 前言
    發(fā)表于 03-13 10:19