初識RabbitMQ
要說RabbitMQ,我們不得不先說下AMQP。AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。
那么RabbitMQ是什么?
RabbitMQ是一個開源的AMQP實現,開源項目地址在GitHub上,可以在GitHub上搜索rabbitmq-tutorials,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX,具有很好的跨平臺特性。用于在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
RabbitMQ和Redis是目前對于高并發高性能網站應用的兩大削峰利器。這兩天在做一個功能的時候也正好用到,所以這一系列就來學習下RabbitMQ,看看它是如何施展拳腳,發揮自己的作用的。
基本概念
如果一上來就干巴巴的將一大推概念會讓很多沒有接觸RabbitMQ的人頭皮發麻,好的產品是因為好用,易懂,而不是一套又一套天花亂墜的概念。所以,我們先看下面一張圖
結合這幅圖,我們大概了解下RabbitMQ的工作流程以及是如何解決問題的。
請點擊此處輸入圖片描述
最左邊的橙色的長方塊Publisher,其表示的生產者,在這里表示是消息的生產者,因為整個流程都是一個消息傳遞的過程
緊挨著的淺黃的圓形Exchange,其表示的是一個交換機,生產者發送的消息并不是直接送到最后的消費者手上,如果真是這樣,那么RabbitMQ就沒有存在的意義。正是由于有Exchange這樣的一個中轉站、緩沖,使得RabbitMQ成為異步處理的很好的手段,從而使削峰成為了可能。
下一個青澀的圓形Queue,其表示的是一個隊列。Queue是用來存儲消息的,RabbitMQ中的消息都只能存儲在Queue中,生產者Publisher生產消息并最終投遞到Queue中,消費者可以從Queue中獲取消息并消費。
流程的最后一個淺黃色長方塊Consumer,其表示的是消費者,消費者從Queue中取出消息,進行消費。注意:粗略來看,RabbitMQ就是一款目的明確,簡單易用的產品。但是作為一款完備的產品,在很多細節的地方都有很好的處理手段,上圖中每一條線,每一次流向都有很多的細節和設計技巧可以講,但是作為入門篇,這里還是循序漸進從最基本的開始。
RabbitMQ的各種Exchange類型
上圖展示的只是一個生產者發送消息到exchange,然后也只有一個消費者通過獲取存儲到Queue中的消息進行消費。但是在實際生產應用中,我們需要實現和應用的類型要更加復雜、多樣。下面我們簡單了解下RabbitMQ還支持了那些類型
Hello World類型
顧名思義,這是一種最基本的類型,這里只有一個生產這和一個消費者,還有一個消息隊列Queue。這個好比送鮮奶的過程,送鮮奶的工作人員將鮮奶投遞帶鮮奶箱中,居民到點或者有空的時候到鮮奶箱里取出自己的鮮奶,這里的送鮮奶的工作人員就是生產者,居民就是消費者,存放鮮奶的鮮奶箱則是這里的隊列Queue。
請點擊此處輸入圖片描述
Work類型
該類型相較于Hello World類型來說,不同之處在于消費者不在只是一個人。對比Hello World類型,它有一個好處,就是不需要像Hello World中的消費者那樣,必須等到把前一個消息消費完之后才能消費第二個。這種模式下當C1拿完隊列中的一個消息后,C2完全可以同時拿走另外一個消息進行處理,這樣的處理方式更加高效。
限于篇幅,這里就介紹這么多,RabbitMQ還有幾種Exchange模型我們放在下篇講,敬請關注^^
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!如果您想持續關注我的文章,請掃描二維碼,關注JackieZheng的微信公眾號,我會將我的文章推送給您,并和您一起分享我日常閱讀過的優質文章。
文章列表