消息隊列中間件可以說是Java開發中最常使用的一塊技術了,基本上上了規模的系統都會使用消息隊列來優化系統架構。那么為什么要使用消息隊列?我們使用消息隊列來解決什么問題呢?
消息隊列的優點
對於大多數系統來說,我們使用消息隊列來做下面三件事情:解耦、削峰、異步。[1]
第一個作用:解耦。
在多個系統中,如果使用傳統模式來做,那么使用傳統模式將是這樣的:
傳統模式的缺點:系統間耦合性太強,如上圖所示,系統A在代碼中直接調用系統B和系統C的代碼。如果將來D系統接入,系統A還需要修改代碼,過於麻煩!
但是如果我們中間件改造一下,那么架構圖如下:
使用消息中間件后,我們將消息寫入消息隊列,需要消息的系統自己從消息隊列中訂閱,從而系統A不需要做任何修改。
第二個作用:異步。
傳統模式下我們出息消息使用串行的方式,一些非必要的業務邏輯以同步的方式運行,太耗費時間。
如果我們使用消息中間件方式,將消息寫入消息隊列,非必要的業務邏輯以異步的方式運行,加快響應速度。
第三個作用:削峰。
在傳統架構中,遇到並發量大的時候,所有的請求直接懟到數據庫,造成數據庫連接異常中間件模
但如果使用了消息中間件,系統A慢慢的按照數據庫能處理的並發量,從消息隊列中慢慢拉取消息。在生產中,這個短暫的高峰期積壓是允許的。
除了上面說到的三大作用,其實消息隊列還有其它作用,例如:可以持久化數據,保證消息之間的順序等等。如果想了解更多消息隊列的作用,可以參考文末資料[2]。
消息隊列的缺點
說了這么多使用消息隊列的好處,但其實消息隊列也不是萬能的,它也有一些缺點。
- 系統復雜性增加。 一個系統如果直接將業務串行處理,那么只需要在一個系統中把代碼寫寫寫就好了。但如果引入消息隊列,則要多考慮很多方面的問題,比如一致性問題、如何保證消息不被重復消費,如何保證保證消息可靠傳輸。因此,需要考慮的東西更多,系統復雜性增大。
- 系統可用性降低。 你想啊,本來其他系統只要運行好好的,那你的系統就是正常的。現在你非要加個消息隊列進去,那消息隊列掛了,你的系統不是呵呵了。因此,系統可用性降低。
其實上面兩個缺點導致的最終結果就是:系統研發成本增加。 引入消息隊列后,你就必須要對大多數消息隊列有個深入的理解,否則如何做技術選型呢?而消息隊列本身也比較復雜,在短時間內無法完全理解。所以是否使用消息隊列需要根據具體場景判斷,而不是為了使用技術而用技術。
總結
本文講了下面幾個要點:
- 消息隊列的優點
- 消息隊列的缺點
看完之后,你應該能解答下面幾個問題:
- 我的系統到底要不要使用消息隊列?
下篇,我們聊聊使用消息隊列需要考慮的幾個問題。