RabbitMQ學習之(一)_初步瞭解RabbitMQ、RabbitMQ的使用流程、為什麼要使用RabbitMQ、RabbitMQ的應用場景

OldBoy~發表於2018-01-08

初識RabbitMQ

RabbitMQ是一個在AMQP協議基礎上實現的訊息佇列系統, 是一個訊息代理。它的核心原理非常簡單:接收和傳送訊息。你可以把它想像成一個郵局:你把信件放入郵箱,郵遞員就會把信件投遞到你的收件人處。在這個比喻中,RabbitMQ 就扮演著郵箱、郵局以及郵遞員的角色,也就是一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取或者訂閱佇列中的訊息,它是用來接收、儲存和傳送訊息(message)這種二進位制資料的。

RabbitMQ是一個開源的AMQP實現,伺服器端用Erlang語言編寫,支援多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支援AJAX。用於在分散式系統中儲存轉發訊息,在易用性、擴充套件性、高可用性等方面表現不俗。

什麼是AMQP?

AMQP,即Advanced Message Queuing Protocol,高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道訊息使用者的存在,反之亦然。
AMQP的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。

關於更詳細的關於RabbitMQ介紹請百度多參考更多的帖子幫助你瞭解~

關於RabbitMQ的關鍵字說明

(1)Broker:經紀人。提供一種傳輸服務,維護一條從生產者到消費者的傳輸線路,保證訊息資料能按照指定的方式傳輸。粗略的可以將圖中的RabbitMQ Server當作Broker。
(2)Exchange:訊息交換機。指定訊息按照什麼規則路由到哪個佇列Queue。
(3)Queue:訊息佇列。訊息的載體,每條訊息都會被投送到一個或多個佇列中。
(4)Binding:繫結。作用就是將Exchange和Queue按照某種路由規則繫結起來。
(5)RoutingKey:路由關鍵字。Exchange根據RoutingKey進行訊息投遞。
(6)Vhost:虛擬主機。一個Broker可以有多個虛擬主機,用作不同使用者的許可權分離。一個虛擬主機持有一組Exchange、Queue和Binding。
(7)Producer:訊息生產者。主要將訊息投遞到對應的Exchange上面。一般是獨立的程式。
(8)Consumer:訊息消費者。訊息的接收者,一般是獨立的程式。
(9)Channel:訊息通道,也稱通道。在客戶端的每個連線裡可以建立多個Channel,每個Channel代表一個會話任務。

RabbitMQ的使用流程
AMQP模型中,訊息在producer中產生,傳送到MQ的exchange上,exchange根據配置的路由方式投遞到相應的Queue上,Queue又將訊息傳送給已經在此Queue上註冊的consumer,訊息從queue到consumer有push和pull兩種方式。
訊息佇列的使用過程大概如下:
(1)客戶端連線到訊息佇列伺服器,開啟一個channel。
(2)客戶端宣告一個exchange,並設定相關屬性。
(3)客戶端宣告一個queue,並設定相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好Binding關係。
(5)生產者客戶端投遞訊息到exchange。
(6)exchange接收到訊息後,就根據訊息的RoutingKey和已經設定的binding,進行訊息路由(投遞),將訊息投遞到一個或多個佇列裡。
(7)消費者客戶端從對應的佇列中獲取並處理訊息。

為什麼使用RabbitMQ?

①安裝部署簡單,上手門檻低,功能豐富,符合AMQP標準;
②企業級訊息佇列,經過大量實踐考驗的高可靠;
③叢集易擴充套件,可以輕鬆的增減叢集節點實現成倍的效能提升;
④有強大的WEB管理頁面幫助管理和監控,有些技術癌更喜歡命令列介面,但WEB管理為後期運維提供很大的便利。
⑤有商業化的運營,不會輕易死掉,可靠性高;
⑥遵循AMQP協議,不會被綁架;
⑦強大的社群支援,為技術進步提供動力;
⑧大量成功的應用案例,例如阿里、網易等網際網路巨頭都有使用。
⑨Erlang開發,AMQP的最佳搭檔,在支援持久化的訊息佇列中效能算很優秀的;
⑩支援訊息持久化、支援訊息確認機制、靈活的任務分發機制等,支援功能非常豐富;

RabbitMQ應用場景

在專案中,將一些無需即時返回且耗時的操作提取出來,進行了非同步操作,而這種非同步處理的方式大大的節省了伺服器的請求時間,從而提高了系統的吞吐量。而且不影響伺服器做其他相應,不獨佔伺服器資源。

如:註冊使用者這種服務,它可能解耦成好幾種獨立的服務(賬號驗證,郵箱驗證碼,手機簡訊碼等)。它們作為消費者,等待使用者輸入資料,在前臺資料提交之後會經過分解併傳送到各個服務所在的url,分發的那個角色就相當於生產者。消費者在獲取資料時候有可能一次不能處理完,那麼它們各自有一個請求佇列,那就是記憶體緩衝區了。做這項工作的框架叫做訊息佇列。

又比如:電商系統中的訂單處理系統,傳統處理模式是:下訂單的時候,訂單系統可能會呼叫庫存系統的介面,這樣兩個系統之間存在一個嚴重依賴關係,如果庫存系統當機,那麼整個流程都會受到影響。現在大多公司的處理方法是:引入訊息佇列,下完訂單,訂單系統完成持久化處理,將訊息寫入訊息佇列,返回使用者訂單下單成功。

對庫存系統來說,採用拉/推的方式,獲取下單資訊,庫存系統根據下單資訊,進行庫存操作。這樣實現了兩個系統間的解耦。

即使在下單時庫存系統不能正常使用。也不影響正常下單,因為下單後,訂單系統寫入訊息佇列就不再關心其他的後續操作了。

文章推薦

http://blog.csdn.net/whoamiyang/article/details/54954780

https://www.cnblogs.com/DaBing0806/p/6680766.html?utm_source=itdadao&utm_medium=referral

相關文章