溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MQ消費(fèi)端遇到瓶頸除了橫向擴(kuò)容外還有哪些解決方法

發(fā)布時(shí)間:2021-10-15 14:35:13 來源:億速云 閱讀:109 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“MQ消費(fèi)端遇到瓶頸除了橫向擴(kuò)容外還有哪些解決方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MQ消費(fèi)端遇到瓶頸除了橫向擴(kuò)容外還有哪些解決方法”吧!

1、面試場景與面試技巧

金三銀四招聘季,一位粉絲朋友最近在螞蟻金服第二輪面試時(shí)遇到這樣一個(gè)問題:如果MQ消費(fèi)遇到瓶頸時(shí)該如何處理?。

橫向擴(kuò)容,相比很多讀者與我這位朋友一樣會脫口而出,面試官顯然不會滿意這樣的回答,然后追問道:橫向擴(kuò)容是堆機(jī)器,還有沒有其他辦法呢?

在面試過程中,個(gè)人建議大家在聽到問題后稍作思考,不要立馬給出太直接的答案,而是應(yīng)該與面試官進(jìn)行探討,一方面可更深刻的理解面試官的出題初衷,同時(shí)可以給自己梳理一下思路。

消費(fèi)端遇到瓶頸,這是一個(gè)結(jié)果,但引起這個(gè)結(jié)果的原因是什么呢?在沒有弄清楚原因之前談優(yōu)化、解決方案都會顯得很蒼白。

在這樣的面試場景中,我們該如何探討交流呢?我的思路如下:

  • 嘗試與面試官探討如何判斷消費(fèi)端遇到瓶頸

  • 如何查找根因

  • 提出解決方案

溫馨提示:為了本文觀點(diǎn)的嚴(yán)謹(jǐn)性,本文主要以RocketMQ為例進(jìn)行剖析。

2、如何判斷消費(fèi)端遇到瓶頸

在RocketMQ消費(fèi)領(lǐng)域中判斷消費(fèi)端遇到瓶頸通常有兩個(gè)重要的指標(biāo):

  • 消息積壓數(shù)量(延遲數(shù)量)

  • lastConsumeTime

在開源版本的控制臺rocketmq-console界面中,可以查閱一個(gè)消費(fèi)端上述兩個(gè)指標(biāo),如下圖所示:

MQ消費(fèi)端遇到瓶頸除了橫向擴(kuò)容外還有哪些解決方法

  • Delay:消息積壓數(shù)量,即消費(fèi)端還剩下多少消息未處理,該值越大,說明消費(fèi)端遇到瓶頸了。

  • LastConsumeTime:表示上一次成功消費(fèi)的消息的存儲時(shí)間,該值離當(dāng)前時(shí)間越大,同樣能說明消費(fèi)端遇到瓶頸了。

那為什么會積壓呢?消費(fèi)端是在哪遇到瓶頸了呢?

3、如何定位問題

消費(fèi)端出現(xiàn)瓶頸,如何識別是客戶端的問題還是服務(wù)端的問題,一個(gè)最簡單的辦法是看集群內(nèi)其他消費(fèi)組是否也有積壓,特別是和有問題的消費(fèi)組訂閱同一個(gè)主題的其他消費(fèi)組是否有積壓,按照筆者的經(jīng)驗(yàn),出現(xiàn)消息積壓通常是客戶端的問題,可以通過查詢  rocketmq_client.log加以證明:

grep "flow" rocketmq_client.log

MQ消費(fèi)端遇到瓶頸除了橫向擴(kuò)容外還有哪些解決方法

出現(xiàn)so do flow control  這樣的日志,說明觸發(fā)了消費(fèi)的限流,其直接觸發(fā)原因:就是消息消費(fèi)端積壓消息,即消費(fèi)端無法消費(fèi)已拉取的消息,為了避免內(nèi)存泄露,RocketMQ在消費(fèi)端沒有將消息處理完成后,不會繼續(xù)向服務(wù)端拉取消息,并打印上述日志。

那如何定位消費(fèi)端慢在哪呢?是卡在哪行代碼呢?

通常的排查方法是跟蹤線程棧,即利用jstack命令查看線程運(yùn)行情況,以此來探究線程的運(yùn)行情況。

通常使用的命令如下:

ps -ef | grep java jstack pid > j1.log

通常為了對比,我一般會連續(xù)打印5個(gè)文件,從而可以在5個(gè)文件中查看同一個(gè)消費(fèi)者線程,其狀態(tài)是否變化,如果未變化,則說明該線程卡主,那就是我們重點(diǎn)需要關(guān)注的地方。

在RocketMQ中,消費(fèi)端線程以ConsumeMessageThread_開頭,通過對線程的判斷,如下代碼讓人為之興奮:

MQ消費(fèi)端遇到瓶頸除了橫向擴(kuò)容外還有哪些解決方法

消費(fèi)端線程的狀態(tài)是RUNNABLE,但在5個(gè)文件中其狀態(tài)都是一樣,基本可以斷定線程卡在具體的代碼,從示例代碼中是卡在掉一個(gè)外部的http借口,從而加以解決,通常在涉及外部調(diào)用,特別是http調(diào)用,可以設(shè)置一個(gè)超時(shí)時(shí)間,避免長時(shí)間等待。

4、解決方案

其實(shí)根據(jù)第三步驟,大概率能明確是哪個(gè)地方慢,遇到了性能瓶頸,通常無非就是調(diào)第三方服務(wù),數(shù)據(jù)庫等問題出現(xiàn)了瓶頸,然后對癥下藥。數(shù)據(jù)庫等性能優(yōu)化,并不在本文的討論范圍之內(nèi),故這里可以點(diǎn)到為止,當(dāng)然面試官后續(xù)可能會繼續(xù)聊數(shù)據(jù)庫優(yōu)化等話題,這樣就實(shí)現(xiàn)了與面試官的交流互動,一環(huán)扣一環(huán),技術(shù)交流氛圍友好,面試通過率大大提高。

最后,我還想和大家探討一個(gè)問題,出現(xiàn)消息積壓就一定意味著遇到消費(fèi)瓶頸,一定需要處理嗎?

其實(shí)也不然,我們回想一下為什么需要使用MQ,不就是利用異步解耦與削峰填谷嗎?例如在雙十一期間,大量突發(fā)流量匯入,此時(shí)很可能導(dǎo)致消息積壓,這正式我們的用意,用MQ抗住突發(fā)流量,后端應(yīng)用慢慢消費(fèi),保證消費(fèi)端的穩(wěn)定,在積壓的情況下,如果tps正常,即問題不大,這個(gè)時(shí)候通常的處理方式就是橫向擴(kuò)容,盡可能的降低積壓,減少業(yè)務(wù)的延遲。

到此,相信大家對“MQ消費(fèi)端遇到瓶頸除了橫向擴(kuò)容外還有哪些解決方法”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

mq
AI