MQ筆記

消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過寫和檢索出入列隊的針對應用程序的數據(消息)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過隊列來通信。

爲什麼需要MQ
1.異步處理請求,緩解系統的壓力。
2.實現多語言通信
3.避免併發問題
4.系統間解耦,方便透明的擴展或縮減生產者和消費者系統
5.穩定可靠

RabbitMQ

是使用Erlang編寫的一個開源的消息隊列,本身支持很多的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。同時實現了一個經紀人(Broker)構架,這意味着消息在發送給客戶端時先在中心隊列排隊。對路由(Routing),負載均衡(Load balance)或者數據持久化都有很好的支持。


Redis

是一個Key-Value的NoSQL數據庫,開發維護很活躍,雖然它是一個Key-Value數據庫存儲系統,但它本身支持MQ功能,所以完全可以當做一個輕量級的隊列服務來使用。對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。測試數據分爲128Bytes、512Bytes、1K和10K四個不同大小的數據。實驗表明:入隊時,當數據比較小時Redis的性能要高於RabbitMQ,而如果數據大小超過了10K,Redis則慢的無法忍受;出隊時,無論數據大小,Redis都表現出非常好的性能,而RabbitMQ的出隊性能則遠低於Redis。

 

入隊

出隊

 

128B

512B

1K

10K

128B

512B

1K

10K

Redis

16088

15961

17094

25

15955

20449

18098

9355

RabbitMQ

10627

9916

9370

2366

3219

3174

2982

1588

ZeroMQ

號稱最快的消息隊列系統,尤其針對大吞吐量的需求場景。ZMQ能夠實現RabbitMQ不擅長的高級/複雜的隊列,但是開發人員需要自己組合多種技術框架,技術上的複雜度是對這MQ能夠應用成功的挑戰。ZeroMQ具有一個獨特的非中間件的模式,你不需要安裝和運行一個消息服務器或中間件,因爲你的應用程序將扮演了這個服務角色。你只需要簡單的引用ZeroMQ程序庫,可以使用NuGet安裝,然後你就可以愉快的在應用程序之間發送消息了。但是ZeroMQ僅提供非持久性的隊列,也就是說如果down機,數據將會丟失。其中,Twitter的Storm中使用ZeroMQ作爲數據流的傳輸。


ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演着特殊的地位。

MQ 與 webservice的區別

Webservice 和MQ(MessageQueue)都是解決跨平臺通信的常用手段,兩者有哪些區別呢?

個人認爲最本質的區別在於 Webservice近乎實時通信,而MQ卻通常是延時通信。 什麼意思呢? 因爲webservice其實就是本地服務器程序調用遠程服務器上的方法,屬於兩者之間的交互,請求的時候需要等被請求的服務器做出迴應後,另一端纔會有所動作,也就是說,如果你請求的service服務器關閉了,或者中斷了,那麼你這邊肯定就得不到答覆了,你的這次請求就算是打水漂丟失了。   而MQ 則相當於是多了一箇中間件 我所發送的請求 都必須先傳達給 這個消息隊列組件,然後由這個消息隊列組件再去到另一個服務器上去請求,有了響應之後再 返回給 當初的請求程序,因爲MessageQueue組件會把消息持久化放在本地,所以哪怕突然死機了,請求消息也是不會丟失的。 比如我們有些複雜的生成報表的請求,生成一張報表可能會相當繁雜,要這麼幾分鐘,那我們肯定不可能在那乾等,這時候就使用MQ,按這個請求報表的需求傳給MQ,等到接收程序處理完返回之後,我這邊會收到通知,這樣就比較好。 常見的MQ組件 包括MSMQ ,Apache ActiveMQ以及一些開源mq等。
發佈了65 篇原創文章 · 獲贊 30 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章