1.MQ的幾種訊息傳遞方式

NO IMAGE

釋出訂閱模式

釋出訂閱模式有點類似於我們日常生活中訂閱報紙。每年到年尾的時候,郵局就會發一本報紙集合讓我們來選擇訂閱哪一個。在這個表裡頭列了所有出版發行的報紙,那麼對於我們每一個訂閱者來說,我們可以選擇一份或者多份報紙。比如北京日報、瀟湘晨報等。那麼這些個我們訂閱的報紙,就相當於釋出訂閱模式裡的topic。有很多個人訂閱報紙,也有人可能和我訂閱了相同的報紙。那麼,在這裡,相當於我們在同一個topic裡註冊了。對於一份報紙發行方來說,它和所有的訂閱者就構成了一個1對多的關係。這種關係如下圖所示:

釋出訂閱模式

點對點模式

點對點模式就相當於打電話,由兩端的雙方獨享這一通訊鏈路

點對點模式

擴充套件的對點模式

和前面兩種方式比較起來,request-response的通訊方式很常見,但是不是預設提供的一種模式。在前面的兩種模式中都是一方負責傳送訊息而另外一方負責處理。而我們實際中的很多應用相當於一種一應一答的過程,需要雙方都能給對方傳送訊息。於是請求-應答的這種通訊方式也很重要。它也應用的很普遍。
請求-應答方式並不是JMS規範系統預設提供的一種通訊方式,而是通過在現有通訊方式的基礎上稍微運用一點技巧實現的。下圖是典型的請求-應答方式的互動過程:

request-response

我在專案中的理解

MQ其實就是一個訊息中轉站。
在企業級的應用裡,會有一個伺服器叢集來作為這個中轉站,這個叢集中有主從,有備份,有路由,有閘道器。此時MQ就是就是一種中介軟體,在個人的實驗中體會不到這種感覺。
企業級的MQ不僅僅實現了簡單的訊息中轉站的功能,還實現了訊息生產者和訊息消費者的認證功能(即他們能消費和生產哪些具體的topic)。
附一張企業MQ的架構圖

mq叢集

MQ的缺點

  1. mq的主要問題在於重複生產和重複消費(延遲也是一個很大的缺點,但是這可以換來效能上的提升,監聽獲取資訊肯定比輪詢獲取資訊的效率高)。
  2. 比如幾個業務系統需要消費一個點對點模式的mq訊息,其中一個業務系統消費成功了但是並沒有向mq伺服器成功傳送消費成功的確認ack,導致訊息在mq伺服器中依然存在,從而導致其他業務系統的重複消費。
  3. 再比如生產者如果沒有接收到mq伺服器的確認訊息,就會重複生產,如果在伺服器沒有相應的去重措施,就會帶來很大的隱患。
  4. 所以在使用MQ的時候,最重要的問題不是在於怎麼去用它,而是怎麼在業務系統中解決重複生產和重複消費的問題。具體的得根據系統允許的容錯率和業務來進行相應的處理。
  5. 我主要說一下在伺服器端對MQ進行去重的方法,如果是同一topic的資訊,可以通過對訊息內容進行摘要運算從而達到簡單的去重效果。

實現可靠MQ和去重參考方法

  1. 訊息的可靠性設計,目前有2種模式:模式1是採用Notify的方式,先傳送半訊息,業務操作成功後最後提交完整訊息,同時提供業務操作的檢查介面,這種模式實現訊息的最終一致性;模式2將業務資料和訊息資料先都存在業務資料庫裡面,通過資料庫的事務保證一致性,隨後將訊息轉發給MQ。模式1的缺點是業務侵入性高,方案比較複雜,需要重新實現;模式2的缺點是訊息資料可能會散落在各個地方,包括業務系統,而且可以整合現有MQ。

  2. 訊息去重設計,也有2種模式:模式1是消費者根據自己的業務實現去重,模式2是在消費者端增加一個資料庫表專門記錄已經消費過的訊息,不需要消費者根據業務去做去重。

作者:進擊的諾基亞
連結:http://www.jianshu.com/p/74475cd251b5
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。