公司項目裏面用到了這個rabbitmq,本身之前不熟悉,看了代碼裏面的應用,本身也準備試着搭建下。html
能夠參照其餘博主的這篇優秀博文: https://www.cnblogs.com/chengpeng15/p/5814197.htmlredis
一 前期須要瞭解的概念算法
1.什麼是異步?什麼是異步通訊?數據庫
異步:客戶端不須要等待服務器處理消息,甚至不須要等待消息投遞完成。客戶端發送消息,而後繼續執行。(由於客戶端假定了服務器最終能夠收到並處理這條消息)瀏覽器
異步通訊是指:有些業務不想也不須要當即處理消息。消息隊列提供了異步處理機制,容許用戶把消息放入隊列,但並不當即處理它。想在隊列中放入多少消息就放多少,而後在須要的時候再去處理他。安全
2.爲何說異步中 間接性 是關鍵?服務器
一個應用向另外一個應用發送消息時,兩個應用間沒有間接的聯繫。而是發送方的應用程序會將消息交給一個服務器(也就是消息中間件), 由服務來將消息投遞給接收方。網絡
3.創建一個消息隊列的服務器,全部內部的通信交互都經過消息隊列進行分發與訂閱。session
4.使用消息隊列有如下的好處 :多線程
A. 解耦
消息隊列在處理過程當中間插入了一個隱含的、基於數據的接口層,兩邊的處理過程都要實現這一接口。這容許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵照一樣的接口約束。
B. 冗餘
有時在處理數據的時候處理過程會失敗。除非數據被持久化,不然將永遠丟失。消息隊列把數據進行持久化直到它們已經被徹底處理,經過這一方式規避了數據丟失風險。在被許多消息隊列所採用的「插入-獲取-刪除」範式中,在把一個消息從隊列中刪除以前,須要你的處理過程明確的指出該消息已經被處理完畢,確保你的數據被安全的保存直到你使用完畢。
C. 擴展性
由於消息隊列解耦了你的處理過程,因此增大消息入隊和處理的頻率是很容易的;只要另外增長處理過程便可。不須要改變代碼、不須要調節參數。擴展就像調大電力按鈕同樣簡單。
D. 靈活性 & 峯值處理能力
在訪問量劇增的狀況下,你的應用仍然須要繼續發揮做用,可是這樣的突發流量並不常見;若是爲以能處理這類峯值訪問爲標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列可以使關鍵組件頂住增加的訪問壓力,而不是由於超出負荷的請求而徹底崩潰。
E. 可恢復性
當體系的一部分組件失效,不會影響到整個系統。消息隊列下降了進程間的耦合度,因此即便一個處理消息的進程掛掉,加入隊列中的消息仍然能夠在系統恢復後被處理。而這種容許重試或者延後處理請求的能力一般是造就一個略感不便的用戶和一個沮喪透頂的用戶之間的區別。
F. 送達保證
消息隊列提供的冗餘機制保證了消息能被實際的處理,只要一個進程讀取了該隊列便可。不管有多少進程在從隊列中領取數據,每個消息只能被處理一次。這之因此成爲可能,是由於獲取一個消息只是"預約"了這個消息,暫時把它移出了隊列。除非客戶端明確的表示已經處理完了這個消息,不然這個消息會被放回隊列中去,在一段可配置的時間以後可再次被處理。
G.排序保證
在許多狀況下,數據處理的順序都很重要。消息隊列原本就是排序的,而且能保證數據會按照特定的順序來處理。消息漿糊經過FIFO(先進先出)的順序來處理,所以消息在隊列中的位置就是從隊列中檢索他們的位置。
H.緩衝
在任何重要的系統中,都會有須要不一樣的處理時間的元素。例如,加載一張圖片比應用過濾器花費更少的時間。消息隊列經過一個緩衝層來幫助任務最高效率的執行--寫入隊列的處理會盡量的快速,而不受從隊列讀的預備處理的約束。該緩衝有助於控制和優化數據流通過系統的速度。
I. 理解數據流
在一個分佈式系統裏,要獲得一個關於用戶操做會用多長時間及其緣由的整體印象,是個巨大的挑戰。消息系列經過消息被處理的頻率,來方便的輔助肯定那些表現不佳的處理過程或領域,這些地方的數據流都不夠優化。
J. 異步通訊
不少時候,你不想也不須要當即處理消息。消息隊列提供了異步處理機制,容許你把一個消息放入隊列,但並不當即處理它。你想向隊列中放入多少消息就放多少,而後在你樂意的時候再去處理它們。
Pub/Sub發佈訂閱(廣播):使用topic做爲通訊載體
PTP點對點:使用queue做爲通訊載體
Broker:消息服務器,做爲server提供消息核心服務
Producer:消息生產者,業務的發起方,負責生產消息傳輸給broker
Consumer:消息消費者,業務的處理方,負責從broker獲取消息並進行業務邏輯處理
Topic:主題,發佈訂閱模式下的消息統一聚集地,不一樣生產者向topic發送消息,由MQ服務器分發到不一樣的訂閱者,實現消息的廣播
Queue:隊列,PTP模式下,特定生產者向特定queue發送消息,消費者訂閱特定的queue完成指定消息的接收
Message:消息體,根據不一樣通訊協議定義的固定格式進行編碼的數據包,來封裝業務數據,實現消息的傳輸
AMQP
AMQP即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,
是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並
不受客戶端/中間件不一樣產品,不一樣開發語言等條件的限制。
優勢:可靠、通用
MQTT協議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通信協
議,有可能成爲物聯網的重要組成部分。該協議支持全部平臺,幾乎能夠把全部聯網物品和外部鏈接起來,
被用來當作傳感器和致動器(好比經過Twitter讓房屋聯網)的通訊協議。
優勢:格式簡潔、佔用帶寬小、移動端通訊、PUSH、嵌入式系統
STOMP協議
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協議,是一種爲MOM(Message Oriented Middleware,面向消息的中間件設計的簡單文本協議。STOMP提供一個可互操做的鏈接格式,容許客戶端與任意STOMP消息代理(Broker)進行交互。
優勢:命令模式(非topic\queue模式)
XMPP協議
XMPP(可擴展消息處理現場協議,Extensible Messaging and Presence Protocol)是基於可擴展標記語言(XML)的協議,多用於即時消息(IM)以及在線現場探測。適用於服務器之間的準即時操做。核心是基於XML流傳輸,這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息,即便其操做系統和瀏覽器不一樣。
優勢:通用公開、兼容性強、可擴展、安全性高,但XML編碼格式佔用帶寬大
其餘基於TCP/IP自定義的協議
有些特殊框架(如:redis、kafka、zeroMq等)根據自身須要未嚴格遵循MQ規範,而是基於TCP\IP自行封裝了一套協議,經過網絡socket接口進行傳輸,實現了MQ的功能。
RabbitMQ
使用Erlang編寫的一個開源的消息隊列,自己支持不少的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的很是重量級,更適合於企業級的開發。同時實現了Broker架構,核心思想是生產者不會將消息直接發送給隊列,消息在發送給客戶端時先在中心隊列排隊。對路由(Routing),負載均衡(Load balance)、數據持久化都有很好的支持。多用於進行企業級的ESB整合。
ZeroMQ
又稱ØMQ、0MQ、ZMQ,號稱最快的消息隊列系統,專門爲高吞吐量、低延遲的場景開發,在金融界的應用中常用,偏重於實時數據通訊場景。ZMQ可以實現RabbitMQ不擅長的高級/複雜的隊列,可是開發人員須要本身組合多種技術框架,開發成本高。所以ZeroMQ具備一個獨特的非中間件的模式,更像一個socket library,你不須要安裝和運行一個消息服務器或中間件,由於你的應用程序自己就是使用ZeroMQ API完成邏輯服務的角色。可是ZeroMQ僅提供非持久性的隊列,若是down機,數據將會丟失。如:Twitter的Storm中使用ZeroMQ做爲數據流的傳輸。 ZeroMQ套接字是與傳輸層無關的:ZeroMQ套接字對全部傳輸層協議定義了統一的API接口。默認支持 進程內(inproc) ,進程間(IPC) ,多播 ,TCP協議,在不一樣的協議之間切換隻要簡單的改變鏈接字符串的前綴。能夠在任什麼時候候以最小的代價從進程間的本地通訊切換到分佈式下的TCP通訊。ZeroMQ在背後處理鏈接創建,斷開和重連邏輯。
特性:
無鎖的隊列模型
對於跨線程間的交互(用戶端和session)之間的數據交換通道pipe,採用無鎖的隊列算法CAS;在pipe的兩端註冊有異步事件,在讀或者寫消息到pipe的時,會自動觸發讀寫事件。
批量處理的算法
對於批量的消息,進行了適應性的優化,能夠批量的接收和發送消息。
多核下的線程綁定,無須CPU切換
區別於傳統的多線程併發模式,信號量或者臨界區, zeroMQ充分利用多核的優點,每一個核綁定運行一個工做者線程,避免多線程之間的CPU切換開銷。
ActiveMQ
Apache下的一個子項目。使用Java徹底支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,少許代碼就能夠高效地實現高級應用場景。可插拔的傳輸協議支持,好比:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持經常使用的多種語言客戶端 C++、Java、.Net,、Python、 Php、 Ruby等。
Redis
使用C語言開發的一個Key-Value的NoSQL數據庫,開發維護很活躍,雖然它是一個Key-Value數據庫存儲系統,但它自己支持MQ功能,因此徹底能夠當作一個輕量級的隊列服務來使用。對於RabbitMQ和Redis的入隊和出隊操做,各執行100萬次,每10萬次記錄一次執行時間。測試數據分爲128Bytes、512Bytes、1K和10K四個不一樣大小的數據。實驗代表:入隊時,當數據比較小時Redis的性能要高於RabbitMQ,而若是數據大小超過了10K,Redis則慢的沒法忍受;出隊時,不管數據大小,Redis都表現出很是好的性能,而RabbitMQ的出隊性能則遠低於Redis。
Kafka
Apache下的一個子項目,使用scala實現的一個高性能分佈式Publish/Subscribe消息隊列系統,具備如下特性: 快速持久化:經過磁盤順序讀寫與零拷貝機制,能夠在O(1)的系統開銷下進行消息持久化;
高吞吐:在一臺普通的服務器上既能夠達到10W/s的吞吐速率;
高堆積:支持topic下消費者較長時間離線,消息堆積量大;
徹底的分佈式系統:Broker、Producer、Consumer都原生自動支持分佈式,依賴zookeeper自動實現複雜均衡;
支持Hadoop數據並行加載:對於像Hadoop的同樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。
--未完,待補充