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