理解JAVA MQ消息中間件


MQ的幾種消息傳遞方式

發布訂閱模式

發布訂閱模式有點類似於我們日常生活中訂閱報紙。每年到年尾的時候,郵局就會發一本報紙集合讓我們來選擇訂閱哪一個。在這個表里頭列了所有出版發行的報紙,那么對於我們每一個訂閱者來說,我們可以選擇一份或者多份報紙。比如北京日報、瀟湘晨報等。那么這些個我們訂閱的報紙,就相當於發布訂閱模式里的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是在消費者端增加一個數據庫表專門記錄已經消費過的消息,不需要消費者根據業務去做去重。


免責聲明!

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



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