面試官:對(duì)于MQ中的消息堆積你是怎么理解的?
在上一篇文章中,我們對(duì)MQ中的消息丟失有了一定的了解,相信再次被面試官問(wèn)到時(shí)心里也就有了底氣了。
文章的地址我放在下面,還沒(méi)有看的可以跳過(guò)去看一下。
我們經(jīng)常說(shuō)的消息堆積通俗點(diǎn)講就是消費(fèi)者消費(fèi)不了了,造成消息在MQ中堆著,然后越來(lái)越多,所以說(shuō)消息堆積是在消費(fèi)者階段的問(wèn)題。
那么發(fā)生消息堆積的原因有哪些呢?
一、消息堆積的原因
- 消費(fèi)者掛掉。
- 消費(fèi)者與 MQ 之間網(wǎng)絡(luò)斷開。
- 消費(fèi)者代碼 BUG ,重復(fù)消費(fèi)一條消息。
- 消息路由 key 錯(cuò)誤,造成個(gè)別分區(qū)消息堆積。
- 消費(fèi)者性能原因,例如業(yè)務(wù)邏輯單表數(shù)據(jù)量過(guò)大造成消費(fèi)時(shí)間緩慢。
除了上述的5個(gè)原因外,如果在工作中你還遇到過(guò)其他造成消息堆積的原因,也歡迎你在評(píng)論區(qū)進(jìn)行交流,一起進(jìn)步。
當(dāng)發(fā)生了消息堆積時(shí),優(yōu)先是解決消息堆積問(wèn)題,然后是排查問(wèn)題制定解決方案。畢竟保證系統(tǒng)的可用性是首先要解決的問(wèn)題??焖俳鉀Q積壓的方法就是通過(guò)水平擴(kuò)容增加消費(fèi)者的實(shí)例數(shù)量。
消息堆積的原因我們知道了,下面我就分享一下在工作中經(jīng)常用的解決消息堆積的幾種方式。
二、怎么解決消息堆積問(wèn)題
- 限制生產(chǎn)者消息生產(chǎn)速度。
- 增加消費(fèi)者數(shù)量,水平擴(kuò)容。
- 排查消費(fèi)者代碼邏輯,保證沒(méi)有一直循環(huán)消費(fèi)一條消息。
- 優(yōu)化消費(fèi)者消費(fèi)邏輯,減少?gòu)?fù)雜計(jì)算邏輯。使用異步、多線程等手段提升消費(fèi)速度。
- 定期清理過(guò)期消息。
對(duì)于第二條增加消費(fèi)者數(shù)量需要注意的是,消息的路由key,分區(qū)等概念。如果配置不正確,新增加的消費(fèi)者并不會(huì)幫忙消費(fèi)堆積的消息,相反只會(huì)對(duì)新增的消息進(jìn)行消費(fèi)。
三、總結(jié)
消息堆積發(fā)生的原因一般就是消費(fèi)者出了問(wèn)題,或者被一個(gè)異常一直錯(cuò)誤的重試。那么解決方式也就是我們上面所說(shuō)的,水平擴(kuò)容消費(fèi)者、消費(fèi)者處理速度優(yōu)化、消費(fèi)者異常重試等。
不過(guò)相對(duì)應(yīng)的,消息的重試也就會(huì)發(fā)生一條消息執(zhí)行多次的情況,那么你的接口做冪等了嗎,下一篇文章,我們就來(lái)看下MQ中的消息重復(fù),如何處理消費(fèi)過(guò)程中的重復(fù)消息。