1. 程式人生 > >訊息中介軟體系列第1講:為什麼要用訊息佇列?

訊息中介軟體系列第1講:為什麼要用訊息佇列?

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

訊息佇列的優點

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

第一個作用:解耦。

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

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

但是如果我們中介軟體改造一下,那麼架構圖如下:

使用訊息中介軟體後,我們將訊息寫入訊息佇列,需要訊息的系統自己從訊息佇列中訂閱,從而系統A不需要做任何修改。

第二個作用:非同步。

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

如果我們使用訊息中介軟體方式,將訊息寫入訊息佇列,非必要的業務邏輯以非同步的方式執行,加快響應速度。

第三個作用:削峰。

在傳統架構中,遇到併發量大的時候,所有的請求直接懟到資料庫,造成資料庫連線異常中介軟體模

但如果使用了訊息中介軟體,系統A慢慢的按照資料庫能處理的併發量,從訊息佇列中慢慢拉取訊息。在生產中,這個短暫的高峰期積壓是允許的。

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

訊息佇列的缺點

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

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

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

總結

本文講了下面幾個要點:

  • 訊息佇列的優點
  • 訊息佇列的缺點

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

  • 我的系統到底要不要使用訊息佇列?

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

參考資料