AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

記一次線程池使用不當觸發死鎖導致RocketMQ消費停滯

來源: 責編: 時間:2024-09-10 09:51:10 114觀看
導讀背景團隊小伙伴突然找到我們團隊說,不得了了,線上的RocketMQ又出現了消費停滯,怎么辦? 要不要我們先重啟一下其實早在之前也出現過一次,當時為了快速恢復業務的,就直接重啟解決的。這次因為堆積量不多,所以想對運行環境進行

背景

團隊小伙伴突然找到我們團隊說,不得了了,線上的RocketMQ又出現了消費停滯,怎么辦? 要不要我們先重啟一下bht28資訊網——每日最新資訊28at.com

其實早在之前也出現過一次,當時為了快速恢復業務的,就直接重啟解決的。bht28資訊網——每日最新資訊28at.com

這次因為堆積量不多,所以想對運行環境進行一些環境快照保留。所以就和業務方溝通是否看見接受短暫的消息延時bht28資訊網——每日最新資訊28at.com

得到肯定答案后就是放手干吧!bht28資訊網——每日最新資訊28at.com

問題定位

首先我們要確定業務反饋的是否屬實,所以需要去RocketMQ dashboard上看看具體的消費進度。bht28資訊網——每日最新資訊28at.com

圖片圖片bht28資訊網——每日最新資訊28at.com

可以看到consumer中并不是全部的queue消費都堆積了,只有一個queuq消息堆積了。bht28資訊網——每日最新資訊28at.com

這個消費者訂閱的topic是分區有序的,正常來說分區有序,如果某個分區的消息單條消息出現了消費異常,必須要等這條消息消費成功(或者是重試結束)后才能繼續消費后面的消息。bht28資訊網——每日最新資訊28at.com

有時候會因為這個原因出現消息堆積是正常的,但是業務對消息重試進行了合理的設置,設置的重試次數比較合理,不會出現長時間的堆積。bht28資訊網——每日最新資訊28at.com

RocketMQ的消費線程

一般出現這種問題很明顯就是線程出現了死鎖或者僵死之類的情況。bht28資訊網——每日最新資訊28at.com

熟悉RocketMQ的都知道RocketMQ消費消息主要是依賴1個線程1個線程池。bht28資訊網——每日最新資訊28at.com

  1. 以PullMessageService開頭的線程, 主要用來拉去消息

圖片圖片bht28資訊網——每日最新資訊28at.com

  1. 以ConsumeMessageThread開頭的線程(實際是一個線程池),主要用來執行消費邏輯。

圖片圖片bht28資訊網——每日最新資訊28at.com

直到了RocketMQ的消費線程模型后我們就好解決了。我們直接通過jstack命令查看線程的堆棧信息。bht28資訊網——每日最新資訊28at.com

線程快照分析

我們直接通過jstack命令生成線程快照。bht28資訊網——每日最新資訊28at.com

jstack <pid> > thread_dump_$(date +%Y%m%d_%H%M%S).txt


bht28資訊網——每日最新資訊28at.com

pid 和后面的 thread_dump_$(date +%Y%m%d_%H%M%S).txt自己隨便取個名字就行。自己記得就行。bht28資訊網——每日最新資訊28at.com

由于應用運行在pod中,生成了我們就下載到本地。bht28資訊網——每日最新資訊28at.com

我們自己看還是比較難分析出分體。這里我們直接使用一個在線的網站進行線程快照的分析。bht28資訊網——每日最新資訊28at.com

fastthread

fastthread是一個在線的線程快照分析工具,可以直接將線程快照上傳到這個網站進行分析。bht28資訊網——每日最新資訊28at.com

圖片圖片bht28資訊網——每日最新資訊28at.com

我們上傳我們下載的線程快照文件。bht28資訊網——每日最新資訊28at.com

然后進行線程分析:bht28資訊網——每日最新資訊28at.com

圖片圖片bht28資訊網——每日最新資訊28at.com

很快定位到阻塞其他線程的代碼。bht28資訊網——每日最新資訊28at.com

這里的代碼被我打碼了。bht28資訊網——每日最新資訊28at.com

arhtas

如果我們使用arthas也可以很方便的找到阻塞的線程。bht28資訊網——每日最新資訊28at.com

thread -b

arthas 提供了thread -b, 一鍵找出那個罪魁禍首。bht28資訊網——每日最新資訊28at.com

問題元兇找到

通過阻塞代碼我們很快定位到是由于線程池使用不當導致的阻塞。bht28資訊網——每日最新資訊28at.com

線程池使用不當

什么情況下會出現線程池使用不當導致的"死鎖"呢?bht28資訊網——每日最新資訊28at.com

我們看看下面的demo:bht28資訊網——每日最新資訊28at.com

public class XiaoZouExample {    public static void main(String[] args) {        ExecutorService executor = new ThreadPoolExecutor(2, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());        // 提交兩個外部任務        for (int i = 0; i < 2; i++) {            executor.submit(new OuterTask(executor));        }        // 等待一段時間后關閉線程池        try {            Thread.sleep(10000);        } catch (InterruptedException e) {            e.printStackTrace();        }        executor.shutdown();    }    static class OuterTask implements Runnable {        private final ExecutorService executor;        public OuterTask(ExecutorService executor) {            this.executor = executor;        }        @Override        public void run() {            System.out.println("小奏技術 Outer task started by thread: " + Thread.currentThread().getName());            // 創建一個Future來等待內部任務的結果            Future<?> future = executor.submit(new InnerTask());            try {                // 等待內部任務完成                future.get();            } catch (InterruptedException | ExecutionException e) {                e.printStackTrace();            }            System.out.println("小奏技術 Outer task finished by thread: " + Thread.currentThread().getName());        }    }    static class InnerTask implements Runnable {        @Override        public void run() {            System.out.println("小奏技術 Inner task started by thread: " + Thread.currentThread().getName());            try {                // 模擬長時間運行的任務                Thread.sleep(5000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("小奏技術 Inner task finished by thread: " + Thread.currentThread().getName());        }    }}
  • 運行結果

圖片圖片bht28資訊網——每日最新資訊28at.com

可以看到沒有任何任務執行完成,線程池一直處于被阻塞狀態。bht28資訊網——每日最新資訊28at.com

核心原因就是首先線程池的核心線程數是2,核心線程用來執行2個任務,用完了所有線程。bht28資訊網——每日最新資訊28at.com

然后在核心線程執行的2個任務中又用原來的線程池進行執行任務,這時候因為沒有線程可以去執行任務了,所以會添加到阻塞隊列中等待核心線程執行完任務后再執行。bht28資訊網——每日最新資訊28at.com

但是核心線程想要釋放任務又必須等待這兩個子任務執行完,這樣就形成了一個死鎖。bht28資訊網——每日最新資訊28at.com

解決方案

解決方式有多種,最簡單的方式可以考慮不要使用隊列,直接使用SynchronousQueue。bht28資訊網——每日最新資訊28at.com

ExecutorService executor = new ThreadPoolExecutor(2, 5, 0L, TimeUnit.MILLISECONDS, new SynchronousQueue<>());

讓多的任務直接通過主線程執行或者丟棄任務。bht28資訊網——每日最新資訊28at.com

當然最好的方式就是避免這種情況的發生,合理的使用線程池,不要線程池中的任務還要使用這個線程池去執行任務。bht28資訊網——每日最新資訊28at.com

這種情況是比較難避免的,因為現在大部分業務開發都是隱式使用線程池,自己也不知道自己用的哪個線程池。bht28資訊網——每日最新資訊28at.com

比如spring的@Async注解,@Scheduled注解等等。bht28資訊網——每日最新資訊28at.com

總結

線程池的使用還是要盡量消息,要避免出現線程池中的任務繼續使用該線程池去執行任務,出現死鎖。bht28資訊網——每日最新資訊28at.com

也可以考慮對線程池進行監控,避免出現大量任務阻塞。bht28資訊網——每日最新資訊28at.com

這個問題想要復現需要大量任務并且超過核心線程數才能復現,還是比較難復現的,只有線上大流量的時候才能復現。bht28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-112791-0.html記一次線程池使用不當觸發死鎖導致RocketMQ消費停滯

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入理解 Babel - 微內核架構與 ECMAScript 標準化

下一篇: 我嘗試重現 React 的 useState() Hook 并失去了工作機會

標簽:
  • 熱門焦點
  • 0糖0卡0脂 旭日森林仙草烏龍茶優惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時要賣為79.9元,今日下單領取50元優惠券,到手價為29.9元。產品規格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 騰訊VS網易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經無忌7月16日晚,上海1862時尚藝術中心。伴隨著幻象的精準命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰隊以絕對的優勢戰勝了BLG戰隊,拿下了總決
  • Android 14發布:首批適配機型公布

    5月11日消息,谷歌在今天凌晨舉行了I/O大會,本次發布會谷歌帶來了自家的AI語言模型PaLM 2、谷歌Pixel Fold折疊屏、谷歌Pixel 7a手機,同時發布了Androi
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發表演講

    11月18日,記者從2022中關村論壇新聞發布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發展改革委、工業和信息化部、國務
Top