消息中間件系列第1講:為什么要用消息隊列?


消息隊列中間件可以說是Java開發中最常使用的一塊技術了,基本上上了規模的系統都會使用消息隊列來優化系統架構。那么為什么要使用消息隊列?我們使用消息隊列來解決什么問題呢?

消息隊列的優點

對於大多數系統來說,我們使用消息隊列來做下面三件事情:解耦、削峰、異步。[1]

第一個作用:解耦。

在多個系統中,如果使用傳統模式來做,那么使用傳統模式將是這樣的:

傳統模式的缺點:系統間耦合性太強,如上圖所示,系統A在代碼中直接調用系統B和系統C的代碼。如果將來D系統接入,系統A還需要修改代碼,過於麻煩!

但是如果我們中間件改造一下,那么架構圖如下:

使用消息中間件后,我們將消息寫入消息隊列,需要消息的系統自己從消息隊列中訂閱,從而系統A不需要做任何修改。

第二個作用:異步。

傳統模式下我們出息消息使用串行的方式,一些非必要的業務邏輯以同步的方式運行,太耗費時間。

如果我們使用消息中間件方式,將消息寫入消息隊列,非必要的業務邏輯以異步的方式運行,加快響應速度。

第三個作用:削峰。

在傳統架構中,遇到並發量大的時候,所有的請求直接懟到數據庫,造成數據庫連接異常中間件模

但如果使用了消息中間件,系統A慢慢的按照數據庫能處理的並發量,從消息隊列中慢慢拉取消息。在生產中,這個短暫的高峰期積壓是允許的。

除了上面說到的三大作用,其實消息隊列還有其它作用,例如:可以持久化數據,保證消息之間的順序等等。如果想了解更多消息隊列的作用,可以參考文末資料[2]。

消息隊列的缺點

說了這么多使用消息隊列的好處,但其實消息隊列也不是萬能的,它也有一些缺點。

  • 系統復雜性增加。 一個系統如果直接將業務串行處理,那么只需要在一個系統中把代碼寫寫寫就好了。但如果引入消息隊列,則要多考慮很多方面的問題,比如一致性問題、如何保證消息不被重復消費,如何保證保證消息可靠傳輸。因此,需要考慮的東西更多,系統復雜性增大。
  • 系統可用性降低。 你想啊,本來其他系統只要運行好好的,那你的系統就是正常的。現在你非要加個消息隊列進去,那消息隊列掛了,你的系統不是呵呵了。因此,系統可用性降低。

其實上面兩個缺點導致的最終結果就是:系統研發成本增加。 引入消息隊列后,你就必須要對大多數消息隊列有個深入的理解,否則如何做技術選型呢?而消息隊列本身也比較復雜,在短時間內無法完全理解。所以是否使用消息隊列需要根據具體場景判斷,而不是為了使用技術而用技術。

總結

本文講了下面幾個要點:

  • 消息隊列的優點
  • 消息隊列的缺點

看完之后,你應該能解答下面幾個問題:

  • 我的系統到底要不要使用消息隊列?

下篇,我們聊聊使用消息隊列需要考慮的幾個問題。

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM