日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

記一次線程池使用不當(dāng)觸發(fā)死鎖導(dǎo)致RocketMQ消費(fèi)停滯

來源: 責(zé)編: 時(shí)間:2024-09-10 09:51:10 211觀看
導(dǎo)讀背景團(tuán)隊(duì)小伙伴突然找到我們團(tuán)隊(duì)說,不得了了,線上的RocketMQ又出現(xiàn)了消費(fèi)停滯,怎么辦? 要不要我們先重啟一下其實(shí)早在之前也出現(xiàn)過一次,當(dāng)時(shí)為了快速恢復(fù)業(yè)務(wù)的,就直接重啟解決的。這次因?yàn)槎逊e量不多,所以想對運(yùn)行環(huán)境進(jìn)行

背景

團(tuán)隊(duì)小伙伴突然找到我們團(tuán)隊(duì)說,不得了了,線上的RocketMQ又出現(xiàn)了消費(fèi)停滯,怎么辦? 要不要我們先重啟一下kjF28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)早在之前也出現(xiàn)過一次,當(dāng)時(shí)為了快速恢復(fù)業(yè)務(wù)的,就直接重啟解決的。kjF28資訊網(wǎng)——每日最新資訊28at.com

這次因?yàn)槎逊e量不多,所以想對運(yùn)行環(huán)境進(jìn)行一些環(huán)境快照保留。所以就和業(yè)務(wù)方溝通是否看見接受短暫的消息延時(shí)kjF28資訊網(wǎng)——每日最新資訊28at.com

得到肯定答案后就是放手干吧!kjF28資訊網(wǎng)——每日最新資訊28at.com

問題定位

首先我們要確定業(yè)務(wù)反饋的是否屬實(shí),所以需要去RocketMQ dashboard上看看具體的消費(fèi)進(jìn)度。kjF28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片kjF28資訊網(wǎng)——每日最新資訊28at.com

可以看到consumer中并不是全部的queue消費(fèi)都堆積了,只有一個(gè)queuq消息堆積了。kjF28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)消費(fèi)者訂閱的topic是分區(qū)有序的,正常來說分區(qū)有序,如果某個(gè)分區(qū)的消息單條消息出現(xiàn)了消費(fèi)異常,必須要等這條消息消費(fèi)成功(或者是重試結(jié)束)后才能繼續(xù)消費(fèi)后面的消息。kjF28資訊網(wǎng)——每日最新資訊28at.com

有時(shí)候會(huì)因?yàn)檫@個(gè)原因出現(xiàn)消息堆積是正常的,但是業(yè)務(wù)對消息重試進(jìn)行了合理的設(shè)置,設(shè)置的重試次數(shù)比較合理,不會(huì)出現(xiàn)長時(shí)間的堆積。kjF28資訊網(wǎng)——每日最新資訊28at.com

RocketMQ的消費(fèi)線程

一般出現(xiàn)這種問題很明顯就是線程出現(xiàn)了死鎖或者僵死之類的情況。kjF28資訊網(wǎng)——每日最新資訊28at.com

熟悉RocketMQ的都知道RocketMQ消費(fèi)消息主要是依賴1個(gè)線程1個(gè)線程池。kjF28資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片kjF28資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片kjF28資訊網(wǎng)——每日最新資訊28at.com

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

線程快照分析

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

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


kjF28資訊網(wǎng)——每日最新資訊28at.com

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

由于應(yīng)用運(yùn)行在pod中,生成了我們就下載到本地。kjF28資訊網(wǎng)——每日最新資訊28at.com

我們自己看還是比較難分析出分體。這里我們直接使用一個(gè)在線的網(wǎng)站進(jìn)行線程快照的分析。kjF28資訊網(wǎng)——每日最新資訊28at.com

fastthread

fastthread是一個(gè)在線的線程快照分析工具,可以直接將線程快照上傳到這個(gè)網(wǎng)站進(jìn)行分析。kjF28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片kjF28資訊網(wǎng)——每日最新資訊28at.com

我們上傳我們下載的線程快照文件。kjF28資訊網(wǎng)——每日最新資訊28at.com

然后進(jìn)行線程分析:kjF28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片kjF28資訊網(wǎng)——每日最新資訊28at.com

很快定位到阻塞其他線程的代碼。kjF28資訊網(wǎng)——每日最新資訊28at.com

這里的代碼被我打碼了。kjF28資訊網(wǎng)——每日最新資訊28at.com

arhtas

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

thread -b

arthas 提供了thread -b, 一鍵找出那個(gè)罪魁禍?zhǔn)住?span style="display:none">kjF28資訊網(wǎng)——每日最新資訊28at.com

問題元兇找到

通過阻塞代碼我們很快定位到是由于線程池使用不當(dāng)導(dǎo)致的阻塞。kjF28資訊網(wǎng)——每日最新資訊28at.com

線程池使用不當(dāng)

什么情況下會(huì)出現(xiàn)線程池使用不當(dāng)導(dǎo)致的"死鎖"呢?kjF28資訊網(wǎng)——每日最新資訊28at.com

我們看看下面的demo:kjF28資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片kjF28資訊網(wǎng)——每日最新資訊28at.com

可以看到?jīng)]有任何任務(wù)執(zhí)行完成,線程池一直處于被阻塞狀態(tài)。kjF28資訊網(wǎng)——每日最新資訊28at.com

核心原因就是首先線程池的核心線程數(shù)是2,核心線程用來執(zhí)行2個(gè)任務(wù),用完了所有線程。kjF28資訊網(wǎng)——每日最新資訊28at.com

然后在核心線程執(zhí)行的2個(gè)任務(wù)中又用原來的線程池進(jìn)行執(zhí)行任務(wù),這時(shí)候因?yàn)闆]有線程可以去執(zhí)行任務(wù)了,所以會(huì)添加到阻塞隊(duì)列中等待核心線程執(zhí)行完任務(wù)后再執(zhí)行。kjF28資訊網(wǎng)——每日最新資訊28at.com

但是核心線程想要釋放任務(wù)又必須等待這兩個(gè)子任務(wù)執(zhí)行完,這樣就形成了一個(gè)死鎖。kjF28資訊網(wǎng)——每日最新資訊28at.com

解決方案

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

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

讓多的任務(wù)直接通過主線程執(zhí)行或者丟棄任務(wù)。kjF28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然最好的方式就是避免這種情況的發(fā)生,合理的使用線程池,不要線程池中的任務(wù)還要使用這個(gè)線程池去執(zhí)行任務(wù)。kjF28資訊網(wǎng)——每日最新資訊28at.com

這種情況是比較難避免的,因?yàn)楝F(xiàn)在大部分業(yè)務(wù)開發(fā)都是隱式使用線程池,自己也不知道自己用的哪個(gè)線程池。kjF28資訊網(wǎng)——每日最新資訊28at.com

比如spring的@Async注解,@Scheduled注解等等。kjF28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

線程池的使用還是要盡量消息,要避免出現(xiàn)線程池中的任務(wù)繼續(xù)使用該線程池去執(zhí)行任務(wù),出現(xiàn)死鎖。kjF28資訊網(wǎng)——每日最新資訊28at.com

也可以考慮對線程池進(jìn)行監(jiān)控,避免出現(xiàn)大量任務(wù)阻塞。kjF28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)問題想要復(fù)現(xiàn)需要大量任務(wù)并且超過核心線程數(shù)才能復(fù)現(xiàn),還是比較難復(fù)現(xiàn)的,只有線上大流量的時(shí)候才能復(fù)現(xiàn)。kjF28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-112791-0.html記一次線程池使用不當(dāng)觸發(fā)死鎖導(dǎo)致RocketMQ消費(fèi)停滯

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 深入理解 Babel - 微內(nèi)核架構(gòu)與 ECMAScript 標(biāo)準(zhǔn)化

下一篇: 我嘗試重現(xiàn) React 的 useState() Hook 并失去了工作機(jī)會(huì)

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产九区一区在线| 久久免费视频在线观看| 亚洲激情视频网站| 亚洲日韩欧美视频| 好吊妞**欧美| 亚洲国产婷婷香蕉久久久久久99| 日韩午夜电影av| 午夜精品久久久久影视| 久久精品国产亚洲一区二区| 欧美福利一区二区三区| 欧美日本不卡| 国产亚洲精品一区二区| 亚洲国产影院| 亚洲免费在线看| 老牛影视一区二区三区| 欧美日韩一区在线| 黄网站色欧美视频| 这里只有视频精品| 欧美在线观看网站| 欧美精品激情blacked18| 国产精品一区=区| 亚洲黄色一区| 亚洲影院色在线观看免费| 久久嫩草精品久久久精品一| 欧美日韩在线播| 黑丝一区二区| 亚洲午夜精品17c| 玖玖在线精品| 国产精品美女在线| 亚洲欧洲日本在线| 羞羞视频在线观看欧美| 欧美高清hd18日本| 国产亚洲精品美女| 夜夜嗨av一区二区三区四季av| 久久久精品一区| 久久亚洲一区| 国产精品推荐精品| 亚洲毛片一区二区| 久久精品国产亚洲一区二区三区| 欧美日韩一区不卡| 在线免费观看一区二区三区| 亚洲欧美日韩爽爽影院| 欧美精品一区在线| 精品成人在线观看| 性亚洲最疯狂xxxx高清| 欧美日韩一区二区三区四区五区 | 亚洲欧美一区二区三区极速播放 | 欧美在线亚洲在线| 国产精品扒开腿做爽爽爽软件| 亚洲高清资源| 欧美制服丝袜| 国产精品久久午夜夜伦鲁鲁| 亚洲欧洲日本在线| 久久久亚洲高清| 国产精品日韩二区| 一本色道婷婷久久欧美| 欧美sm极限捆绑bd| 红桃视频欧美| 性久久久久久| 欧美午夜在线视频| 9久re热视频在线精品| 免费视频久久| 在线看日韩av| 久久久久在线观看| 国产午夜精品久久| 午夜精品视频| 国产精品区一区二区三区| 一区二区三区精品久久久| 欧美国产免费| 亚洲日本无吗高清不卡| 美女尤物久久精品| 亚洲国产精品一区在线观看不卡 | 国产精品最新自拍| 亚洲欧美怡红院| 国产精品久久久久毛片大屁完整版| 99在线热播精品免费| 中文在线一区| 欧美日韩国产首页在线观看| 亚洲国产天堂久久国产91| 久久亚洲国产精品一区二区| 精品成人一区二区三区| 久久久久久亚洲综合影院红桃| 国产日产高清欧美一区二区三区| 亚洲女优在线| 国产精品一区视频| 亚洲一区黄色| 国产精品一区二区三区乱码| 午夜欧美精品| 国产私拍一区| 久久精品女人| 激情偷拍久久| 美女网站久久| 亚洲精品美女在线观看播放| 欧美精品www在线观看| 亚洲免费观看在线视频| 欧美日韩一区三区| 亚洲成在人线av| 嫩模写真一区二区三区三州| 亚洲欧洲精品一区二区| 免费一级欧美片在线播放| 亚洲欧洲一区| 欧美日精品一区视频| 亚洲一区二区免费| 国产伦精品一区| 久久久国产成人精品| 亚洲福利视频免费观看| 欧美精品一区二区三区在线播放| 一区二区三区欧美在线| 国产欧美日韩视频一区二区| 亚洲精品一区二区三区不| 欧美日韩国产美| 亚洲一区二区三区中文字幕在线| 国产精品一区一区| 另类图片综合电影| 日韩一级精品| 国产精品女主播在线观看 | 老色批av在线精品| 国产午夜精品美女视频明星a级| 久久青草欧美一区二区三区| 亚洲国产精品999| 欧美日韩裸体免费视频| 性久久久久久久久| 亚洲电影在线播放| 欧美视频免费在线观看| 久久aⅴ国产欧美74aaa| 亚洲国产一区二区三区青草影视| 欧美色大人视频| 99精品国产高清一区二区| 国产精品自拍三区| 美女网站久久| 中文高清一区| 一区二区在线观看av| 欧美日韩国产专区| 欧美中文字幕久久| 亚洲欧洲日韩综合二区| 国产精品久久久久久福利一牛影视| 久久精品中文字幕免费mv| 亚洲精品视频啊美女在线直播| 国产精品美女主播在线观看纯欲| 久久精品免费电影| a4yy欧美一区二区三区| 国产一区二区三区自拍| 欧美日韩福利视频| 久久精品最新地址| 宅男噜噜噜66一区二区| 1769国内精品视频在线播放| 国产精品进线69影院| 免费中文日韩| 欧美在线免费观看亚洲| 一区二区三区视频免费在线观看| 一区二区在线看| 国产精品视频免费在线观看| 欧美电影在线| 久久久久久久久岛国免费| 亚洲一区二区三区涩| 亚洲精品一二三| 在线观看三级视频欧美| 国产欧美日本一区二区三区| 欧美精品日日鲁夜夜添| 久久全国免费视频| 午夜一区在线| 中文国产成人精品久久一| 最新精品在线| 在线免费观看视频一区| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲高清免费在线| 国产性做久久久久久| 欧美亚州韩日在线看免费版国语版| 蜜臀av一级做a爰片久久| 欧美在线视频免费| 亚洲欧美精品在线| 夜夜爽www精品| 亚洲国内在线| 激情综合久久| 国产亚洲网站| 国产女主播一区二区| 国产精品久久久久久久久 | 国产亚洲成年网址在线观看| 国产精品国产福利国产秒拍| 欧美啪啪一区| 欧美韩国一区| 欧美成人dvd在线视频| 久久久精品国产免费观看同学| 亚洲影视中文字幕| 一区二区三区四区国产| 亚洲精品美女久久7777777| 亚洲国语精品自产拍在线观看| 伊人久久大香线蕉综合热线| 国产一区视频网站| 国产亚洲欧美日韩精品| 国产欧美一级| 国产麻豆精品在线观看| 国产精品视频一二三| 国产精品乱码人人做人人爱| 欧美性事免费在线观看| 欧美性jizz18性欧美| 欧美三级电影精品| 欧美天天影院| 国产精品久久| 国产精品日韩欧美综合| 国产精品国内视频| 国产精品久久久久久久久久免费| 国产精品福利在线观看网址| 国产精品久久久久久影视|