一、消息隊列之RabbitMQ
1.1、什麽是消息隊列
消息(Message)是指在應用間傳送的數據。消息可以非常簡單,比如只包含文本字符串、JSON等,也可以很復雜,比如內嵌對象。
消息隊列(Message Queue,簡稱為MQ)是一種應用間的通信方式,消息發送後可以立即返回,由消息系統來確保消息的可靠傳遞。消息發布者只管把消息發布到 MQ 中而不用管誰來取,消息使用者只管從 MQ 中取消息而不管是誰發布的。這樣發布者和使用者都不用知道對方的存在。
消息隊列適用於需要可靠的數據傳送的分布式環境。采用消息中間件的系統中,不同的對象之間通過傳遞信息來激活對方的事件,以完成相應的操作。發送者將消息發送給消息服務器,消息服務器將消息存放在若幹隊列中,在合適的時候再將消息轉發給接收者。
特性:
松耦合
消息隊列提供了以松散耦合的靈活方式集成應用程序的一種機制。它們提供了基於存儲和轉發的應用程序之間的異步數據發送,即應用程序彼此不直接通信,而是與作為中介的消息中間件通信。
冗余(存儲)
有些情況下,處理數據的過程會失敗。消息中間件可以把數據持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。在把一個消息從消息中間件中刪除之前,需要你的處理系統明確的指出該消息已經被處理完成,從而確保你的數據被完全第保存直到你使用完畢。
擴展性
因為消息中間件解耦了應用的處理過程,所以提高消息入隊和處理的效率是很容易的,只要另外增加處理過程即可,不需要改變代碼,也不需要調節參數。
削峰
在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見。如果以能處理這類峰值為標準而投入資源,無疑是巨大的浪費。使用消息中間件能夠使關鍵組件支撐突發訪問壓力,不會因為突發的超負荷請求而完全崩潰。
可恢復性
當系統一部分組件失效時,不會影響到整個系統。消息中間件降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入消息中間件中的消息仍然可以在系統恢復後進行處理。
順序保證
在大多數使用場景下,數據處理的順序很重要,大部分消息中間件支持一定程序上的順序性。
緩沖
在任何重要的系統中,都會存在需要不同處理時間的元素。消息中間件通過一個緩沖層來幫助任務最高效率地執行,寫入消息中間件的處理會盡可能快速。該緩沖層有助於控制和優化數據流經過系統的速度。
異步通信
在很多時候應用不想也不需要立即處理消息。消息中間件提供了異步處理機制,允許應用把一些消息放入消息中間件中,但並不立即處理它,在之後需要的時候再慢慢處理。
為什麽使用消息隊列:
如最常見訂單系統,用戶點擊下單後,需要發短信通知、返代金劵等,如果業務過大,需要提升性能,可以把發短信、返代金劵等不需要立即執行的操作拆分處理進行異步執行。這時可以用MQ
消息隊列,在下單完成後,主程序發送一條消息到MQ後
結束,由另外的線程拉取MQ
(或由MQ
推送)消息,當發現由相關信息後,執行發短信、返代金劵操作。減輕了主程序的壓力。
以上是用於業務解耦的情況,其他常見場景包括一致性、廣播、削峰等。
1.2、消息模型
所有 MQ 產品從模型抽象上來說都是一樣的過程:
消費者(consumer)訂閱某個隊列。生產者(producer)創建消息,然後發布到隊列(queue)中,最後將消息發送到監聽的消費者。
1.3、RabbitMQ
RabbitMQ是流行的開源消息隊列系統,是由Erlang語言開發的AMQP(Advanced Message Queuing Protocol高級消息隊列協議)的標準實現。具有良好的性能和時效性,同時還能夠非常好的支持集群和負載部署,非常適合在較大規模的分布式系統中使用。
AMQP :Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標準,為面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制,可以與不同產品、不同語言之間進行消息交互。
為什麽使用RabbitMQ
:
- 安裝部署簡單,上手門檻低,功能豐富,符合AMQP標準;
- 企業級消息隊列,經過大量實踐考驗的高可靠;
- 集群易擴展,可以輕松的增減集群節點;
- 有強大的WEB管理頁面。
RabbitMQ作為消息隊列系統優勢:
從http://www.doc88.com/p-5826232080382.html 中對於RabbitMQ
評價有兩個維度:十萬米高空看RabbitMQ
和顯微鏡看RabbitMQ
:
- 十萬米高空看
RabbitMQ
:- 有商業化的運營,不會輕易死掉;
- 遵循AMQP協議,不會被綁架;
- 強大的社區支持,為技術進步提供動力;
- 大量成功的應用案例,例如阿裏、網易等互聯網巨頭都有使用。
- 顯微鏡看
RabbitMQ
:- Erlang開發,AMQP的標準實現,在支持持久化的消息隊列中性能算很優秀的;
- 支持消息持久化、支持消息確認機制、靈活的任務分發機制等,支持功能非常豐富;
- 可靠性高;
- 集群擴展很容易,並且可以通過增加節點實現成倍的性能提升;
- WEB管理和監控,有些技術癌更喜歡命令行界面,但WEB管理為後期運維提供很大的便利。
RabbitMQ劣勢:
性能比kafka和zero面前性能差(持久化消息和ACK確認的情況下生產和消費消息單機大約在1-2萬左右)
結論:如果希望使用一個可靠性高、功能強大、易於管理的消息隊列系統那麽就選擇RabbitMQ,如果想用一個性能高,但偶爾丟點數據不是很在乎可以使用kafka或者zeroMQ。
RabbitMQ的特點有如下幾點:
可靠性(Reliability)
RabbitMQ使用一些機制來保證可靠性,如持久化、傳輸確認及發布確認等。
靈活的路由(Flexible Routing)
在消息進入隊列前,通過交換機來路由消息。對於典型的路由功能,RabbitMQ已經提供了一些內置的交換器來實現。針對更復雜的路由功能,可以將多個交換器綁定在一起,也可以通過插件機制來實現自己的交換器。
消息集群(Clustering)
多個RabbitMQ節點可以組成一個集群,也可以根據實際業務情況動態地擴展集群中節點。
高可用性(Highly Available Queues)
隊列可以在集群中的機器上設置鏡像,使得部分節點出現問題的情況下隊列仍然可用。
多種協議(Multi-protocol)
RabbitMQ除了原生支持AMQP協議,還支持STOMP、MQTT等多種消息中間件協議。
多語言客戶端(Many Clients)
RabbitMQ幾乎支持所有常用語言,比如Java、Python、Ruby、PHP、C#、JavaScript等。
管理界面(Management UI)
RabbitMQ提供了一個易用的用戶界面,使得用戶可以監控和管理消息、集群中的節點等。
跟蹤機制(Tracing)
如果消息異常,
RabbitMQ
提供了消息跟蹤機制,使用者可以找出發生了什麽。插件機制(Plugin System)
RabbitMQ提供了許多插件,以實現從多方面進行擴展,當然也可以編寫自己的插件。
一、消息隊列之RabbitMQ