国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

線上 TraceId 集體失蹤,如何破局?

開發 前端
并發工具極大提升了并發代碼編寫的效率,也預先為潛在問題備好高效解法,是開發過程中的得力助手。但開發人員不能僅滿足于表面應用,務必深入剖析其實現邏輯,明晰不同場景下的適用規則。

近期線上環境出現詭異問題,異步任務里鏈路 ID(TraceId)莫名丟失,致使核心業務日志斷鏈,嚴重影響問題排查。今天給大家分享三種有效解決辦法 。

1. 事件回顧

3.8 大促期間,我司交易系統流量劇增。在排查問題過程中,我們發現下單主流程的日志出現異常,部分 TraceId 丟失,致使調用鏈路中斷,排查難度急劇上升 。

[2025-03-08 02:15:33] [TID:4a3b...8c2d] INFO 支付校驗通過 → 庫存扣減成功  

// 異常日志片段(TraceId丟失?。?[2025-03-08 02:15:34] [TID:N/A] ERROR 優惠券核銷失敗

2. 問題定位

通過代碼逐層排查,最終鎖定“真兇”——一段使用 CompletableFuture 的異步處理代碼:

public void processOrder(Order order) {
    // 主線程(攜帶TraceId)
    log.info("[主線程] 開始處理訂單 {}", order.getId()); 
    
    CompletableFuture.runAsync(() -> {
        // 子線程(TraceId丟失?。?        log.info("優惠券核銷"); 
        couponService.useCoupon(order.getCouponId());
    }, executor);
}

3. 原因分析

根本原因:MDC 依賴 ThreadLocal 實現線程本地存儲,每個線程都有獨立的上下文存儲空間。而線程池復用機制下,子線程被創建時,無法自動繼承父線程 ThreadLocal 中的上下文數據,從而引發 TraceId 丟失沖突 。

MDC 實現原理:

  • MDC 底層基于 ThreadLocal 實現,為每個線程創建獨立的鍵值存儲空間;
  • 日志框架通過 %X{traceId} 模式從當前線程的 ThreadLocal 中提取鏈路ID。

線程池運行機制:

  • 線程復用:池化線程完成任務后不會銷毀,而是返回池中等待新任務;
  • 線程隔離:不同線程持有完全獨立的 ThreadLocal 存儲空間。

典型問題場景:

public static void main(String[] args) {
    // 主線程設置鏈路ID
    ThreadLocal<String> traceIdHolder = new ThreadLocal<>();
    traceIdHolder.set("main-tid");

    // 子線程無法訪問主線程的ThreadLocal
    CompletableFuture.runAsync(() -> {
        System.out.println(Thread.currentThread().getName() + ":" + traceIdHolder.get()); // 輸出null
    });

    System.out.println(Thread.currentThread().getName() + ":" + traceIdHolder.get());
}

在這里插入圖片描述在這里插入圖片描述

4. 解決方案

方案一:手動傳遞上下文

在提交異步任務時,手動捕獲并傳遞 TraceId,確保子線程能獲取到主線程的 TraceId。

public void processOrder(Order order) {
    // 主線程(攜帶TraceId)
    log.info("[主線程] 開始處理訂單 {}", order.getId()); 
    String tid = MDC.get(TID);

    CompletableFuture.runAsync(() -> {
    MDC.put(TID,tid);
        log.info("[異步任務] 核銷優惠券"); 
        couponService.useCoupon(order.getCouponId());
    }, executor);
}

這種方式簡單直接,不過需要在每個異步任務中手動添加代碼,代碼侵入性較強,且容易遺漏。

方案二:自定義線程池包裝任務

自定義線程池,在提交任務時自動保存當前線程的 MDC 上下文,并在任務執行時恢復,避免手動操作的繁瑣。

class MDCTaskDecorator implements Runnable {
    privatefinal Runnable delegate;
    privatefinal Map<String, String> context;

    public MDCTaskDecorator(Runnable delegate, Map<String, String> context) {
        this.delegate = delegate;
        this.context = context;
    }

    @Override
    public void run() {
        Map<String, String> originalContext = MDC.getCopyOfContextMap();
        try {
            if (context != null) {
                MDC.setContextMap(context);
            }
            delegate.run();
        } finally {
            if (originalContext != null) {
                MDC.setContextMap(originalContext);
            } else {
                MDC.clear();
            }
        }
    }
}

class MDCTaskExecutor extends ThreadPoolExecutor {
    public MDCTaskExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    @Override
    public void execute(Runnable command) {
        Map<String, String> context = MDC.getCopyOfContextMap();
        super.execute(new MDCTaskDecorator(command, context));
    }
}

class CustomThreadPoolSolution {
    privatestaticfinal Logger logger = LoggerFactory.getLogger(CustomThreadPoolSolution.class);

    public static void main(String[] args) {
        MDC.put("trace_id", "654321");
        MDCTaskExecutor executor = new MDCTaskExecutor(
                1, 1, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>()
        );
        executor.execute(() -> logger.info("異步任務執行,trace_id: {}", MDC.get("trace_id")));
        executor.shutdown();
    }
}

此方案將上下文傳遞的邏輯封裝在線程池中,對業務代碼的侵入性較小,但實現起來相對復雜。

方案三:使用分布式追蹤框架

借助分布式追蹤框架,如 Skywalking、Zipkin、Pinpoint等,它們能自動為應用程序生成鏈路 ID,并在多線程、異步調用等場景下正確傳遞鏈路 ID,大大簡化開發人員在鏈路追蹤方面的操作。

這些框架通過內置的機制,在不同的服務和線程之間自動傳遞 TraceId,無需手動干預,降低了出錯的概率,同時提供了可視化的界面和工具,方便開發人員監控和分析調用鏈路。

5. 總結

并發工具極大提升了并發代碼編寫的效率,也預先為潛在問題備好高效解法,是開發過程中的得力助手。

但開發人員不能僅滿足于表面應用,務必深入剖析其實現邏輯,明晰不同場景下的適用規則。

若對并發工具一知半解、盲目套用,不僅難以發揮其最大效能,面對復雜問題時會陷入被動,更可能在生產環境中引發嚴重線上故障。

所以 J.U.C 雖好,可不要貪杯哦!

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2019-10-25 10:33:17

程序員技能開發者

2020-11-30 15:04:23

大數據

2021-08-17 10:13:19

大數據數字經濟數據技術

2010-04-23 15:07:08

云計算

2015-02-02 14:06:33

微軟win10

2018-04-16 05:29:35

CDNCDN牌照互聯網

2020-06-08 17:26:35

TORRAS

2013-11-22 16:39:24

智慧城市

2021-08-12 23:19:52

網絡安全比特幣黑客

2015-06-25 17:24:26

IDC云服務公有云

2009-06-16 11:18:56

2009-02-01 23:19:37

2019-04-15 13:18:38

開源AWS云供應商

2021-07-30 10:47:38

網絡安全大數據技術

2025-10-29 07:00:00

供應鏈企業關稅

2020-12-22 09:26:36

網絡安全信息安全華為

2017-08-25 14:57:54

新華三服務器HPE

2019-06-06 09:31:45

開源技術 趨勢
點贊
收藏

51CTO技術棧公眾號

依依成人精品视频| 欧美日韩精品一区二区| 国产精品二区在线观看| 黄色欧美网站| 这里只有精品久久| 福利小视频在线| 欧美剧情片在线观看| 在线免费看污| 一区二区三区av电影| 国产超碰在线播放| 99久久精品国产网站| 欧洲金发美女大战黑人| 丝袜诱惑亚洲看片| 不卡一区二区三区视频| jiujiure精品视频播放| 57pao成人国产永久免费| 亚洲欧洲专区| 久久99热精品| 99re91这里只有精品| 免费91在线视频| 999精品视频在线观看| 中文字幕久热精品在线视频| 在线能看的av网址| 亚洲日本aⅴ片在线观看香蕉| 三级在线观看视频| 国产一区二区三区视频免费| 中文字幕系列一区| 中文字幕亚洲字幕| 免费一级欧美在线大片| 欧美高清视频一区二区| 亚洲级视频在线观看免费1级| 人成免费电影一二三区在线观看| 亚洲成人第一页| 嫩草研究院在线观看| 欧美色爱综合网| 巨大荫蒂视频欧美大片| 亚洲国产日韩欧美在线图片| 日韩在线免费| 国内偷自视频区视频综合| 自拍偷拍欧美一区| 成人激情视频在线| 亚洲图片在线| 宅男一区二区三区| 96av麻豆蜜桃一区二区| 黄色国产网站在线观看| 色综合天天狠狠| 大香伊人久久| 欧美激情视频网站| 午夜精品毛片| 日韩免费三级| av电影在线观看完整版一区二区| 香蕉视频禁止18| 91精品福利视频| av综合电影网站| 欧美一级黑人aaaaaaa做受| 久久亚洲影视| 一区在线电影| 国产欧美精品一区| 欧美色图另类| 一区二区三区日韩在线| 中文av在线播放| 欧美理论片在线| 欧美色999| 国产精品日韩电影| 免费高清成人在线| 国产又大又黄又猛| 欧美日韩成人一区二区| 欧美男男gaygay1069| 成人av.网址在线网站| 美国三级日本三级久久99| 男人搞女人网站| 欧美亚洲禁片免费| 电影一区二区三区久久免费观看| 成人激情黄色网| 黄一区二区三区| 在线观看成年人视频| 亚洲精品美女网站| 国产影视一区| 懂色av一区二区三区四区五区| 26uuu精品一区二区在线观看| 一区 二区 三区| 亚洲天堂影视av| 99久久亚洲精品蜜臀| 在线观看av的网址| 91搞黄在线观看| jazzjazz国产精品久久| 日韩av一级大片| 亚洲综合一二三区| 成人亚洲网站| 欧美日韩在线观看一区| 亚洲欧美电影一区二区| xxx欧美xxx| 风间由美久久久| 中文字幕一区二区三区在线不卡| 美女精品视频| 亚洲精品欧美日韩| 欧美国产日韩a欧美在线观看 | 欧美另类高清zo欧美| 香蕉大人久久国产成人av| 亚洲成人第一| 欧美色网一区二区| 色棕色天天综合网| 国产喷水theporn| 最新国产精品拍自在线播放| 亚洲作爱视频| 亚洲有码转帖| 日本精品一区二区三区在线播放视频 | 亚洲午夜免费| 一区二区精品在线观看| 欧美日韩亚洲高清一区二区| 国产中文精品久高清在线不| 成年人黄色片视频| 国产一区二区三区高清在线观看| 日日夜夜免费精品| 毛片在线播放a| 亚洲free性xxxx护士白浆| 亚洲人成亚洲人成在线观看图片| 91麻豆精品| 国产在线播放观看| 亚洲欧美一区二区三区久久| 丝袜a∨在线一区二区三区不卡| 国产视频在线看| 亚洲一区二区三区在线视频| 亚洲电影在线免费观看| 免费成人网www| 国产h色视频在线观看| 欧美精品videosex牲欧美| www久久久久| 日韩精品一区二区三区中文在线| 久久视频这里有精品| 三级精品视频久久久久| 成人中文字幕电影| 欧美成人免费电影| 丁香花在线影院观看在线播放| 亚洲男人av电影| 国产精品 日产精品 欧美精品| 欧美xxx视频| 日本黄色三级大片| 韩日欧美一区二区| 亚洲视频 欧洲视频| 日韩一级电影| 欧美hdfree性xxxx| 国产高清自拍99| 日韩欧美一级精品久久| 秋霞av亚洲一区二区三| 末成年女av片一区二区下载| 国产黄色激情视频| 久久亚洲精品小早川怜子66| 中文字幕精品在线不卡| 亚洲人成网站77777在线观看| 中文在线天堂库| 久久66热这里只有精品| 欧美一级视频精品观看| 蜜臀av一区二区在线观看| 日韩a**中文字幕| 中文字幕国产传媒| 国产精品久久中文| 欧美日韩国产a| 国产成人av影院| 国产成人精品免费视| 调教视频免费在线观看| www.国产亚洲| 人妖精品videosex性欧美| 欧美日韩一区二区电影| 国产福利91精品| 日韩大尺度在线观看| 成人欧美亚洲| 国产毛片视频网站| 国产精品成人一区二区三区吃奶| 69堂成人精品免费视频| 99久久精品费精品国产一区二区| blacked蜜桃精品一区| 国精一区二区三区| 综合网插菊花| 久久伦理网站| 欧美激情精品久久久久| 欧美视频一区在线| 99精品视频中文字幕| 婷婷综合五月| 久久夜夜操妹子| 日本免费视频| 天天爱天天做天天操| 日韩av色综合| 亚洲精品国产拍免费91在线| 中文字幕在线一区免费| 日韩国产欧美在线观看| 麻豆成人入口| 不卡一本毛片| eeuss一区| 欧美亚洲色图视频| 成人网在线观看| 日韩电影视频免费| 亚洲成人激情综合网| 国产麻豆日韩欧美久久| 国产精品91一区二区三区| 欧美国产视频| 免费在线看污片| 一级视频在线免费观看| 国产l精品国产亚洲区久久| 精品999在线观看|