1.問題排查
某服務(wù)端應(yīng)用性能測試,時刻A后陷入假死狀態(tài),不對外提供服務(wù)。體現(xiàn)為:
-
A時刻后,系統(tǒng)資源消耗下跌:
1.1 CPU占用率下降。
1.2 磁盤與網(wǎng)絡(luò)IO下降。
1.3 內(nèi)存占用率下降。 - Dump應(yīng)用JVM,業(yè)務(wù)線程均被RabbitMQ客戶端阻塞。
- RabbitMQ服務(wù)器消息堆積,隊(duì)列狀態(tài)為Block。
根據(jù)以上特征,初步推測RabbitMQ服務(wù)端出于某種策略,阻塞了RabbitMQ客戶端繼續(xù)寫入消息,進(jìn)而阻塞了同步調(diào)用RabbitMQ客戶端的應(yīng)用線程。
當(dāng)服務(wù)器(TOMCAT)線程池完全阻塞后,應(yīng)用體現(xiàn)為不對外服務(wù)且系統(tǒng)資源消耗驟降。
2.什么是RabbitMQ-Connection-Blocked,如何在應(yīng)用程序中處理該場景?
Blocked Connection Notifications
3.思考
延伸來看,作為開發(fā)者,選擇中間件時,不僅要觀察它能解決什么問題,還要考慮引入它帶來的代價與風(fēng)險。例如本文所遭遇的場景,高壓環(huán)境下,RabbitMQ出于自身保護(hù)策略,通過阻塞方式限制寫入,導(dǎo)致了生產(chǎn)者應(yīng)用“假死”,不對外服務(wù)。在未深入理解此類問題,并開發(fā)代碼進(jìn)行降級保護(hù)前,就有可能引發(fā)線上事故,影響到用戶實(shí)際體驗(yàn),造成不可挽回的損失。