RabbitMQ是採用Erland語言實現AMQP(Advance Message Queuing Protrol,高級消息隊列)的消息中間件。RabbitMQ是一個生產者和消費者模型,主要負責接收,存儲和轉發消息。傳遞過程相似於你將一個包裹送到郵局,郵局會暫存並最終將郵件經過快遞員送到接受人的手上,RabbitMQ就相似於郵局、郵箱、郵遞員組成的一個系統。json
1.消息中間件是什麼緩存
消息:應用之間傳送的數據(文本/json等)安全
消息中間件:message queue Middleware簡稱MQ。指利用高效可靠的消息傳遞機制進行平臺無關的數據交流,並基於數據通訊來進行分佈式的集成。經過提供消息傳遞和消息排隊模型。實現進程間的通訊服務器
消息隊列中間:可稱爲消息隊列或者消息中間件,傳遞方式分爲兩種點對點(P2P,Point-to-Potint)模式和發佈訂閱(Pub/Sub)模式異步
P2P:分佈式
Pub/Sub:性能
2.做用ui
2.生產者、消費者、Broker線程
生產者:producer,即投遞消息的一方,生成着建立消息,而後發佈到RabbitMQ中,通常包含兩部分:消息體(Payload)和標籤(Label)中間件
消息體:通常就是帶有業務邏輯的數據好比json
標籤:設置的路由規則,將消息發送給RabbitMQ後,RabbitMQ會根據標籤發送給對應的消費者,在消息存入隊列中時,消息的標籤會丟失,存到隊列中的只有消息體
消費者:consumer,接收消息的一方。消費者鏈接到RabbitMQ服務器上並訂閱到隊列上。
隊列:queue,RabbitMQ中的對象,用於存儲消息,且RabbitMQ的消息只能存儲到隊列中
消息中間件的服務節點:Broker。RabbitMQ的一個服務節點或者RabbitMQ服務實例。
具體流程:
生產者
1.鏈接RabbitMQ Broker,創建一個鏈接,開啓通道
2.生產者交換器和隊列並設置相關屬性
3.將交換器和隊列進行綁定
4.生產者發送消息給RabbitMQ Broker
5.交換器根據路由查找相對應的隊列
6.找到則存入隊列,沒有找到根據生產者的配置屬性選擇丟棄仍是會退給生產者
7.關閉信道
8.關閉鏈接
消費者
1.鏈接到RabbitMQ,建議一個鏈接和信道
2.發送請求消費相對應的隊列中的消息
3.等待Broker的迴應,接收消息
4.消費者確認接收到消息
5.RabbitMQ從隊列中刪除相應的確認消息
6.關閉信道
7.關閉鏈接
交換器,路由鍵、綁定
交換器:RabbitMQ中的實體,生產者先把消息傳輸給交換器,由交換器把消息發送給一個或者多個隊列。交換器類型分爲四種:
1.fanout,交換器將消息發送給與交換器綁定的隊列和其餘交換器
2.direct:交換器徹底按照路由規則進行匹配發送給相對應的隊列或交換器
3.topic:direct的升級,進行模糊匹配
4.header:不依賴於交換器和隊列幾乎不使用該類型
路由鍵
RoutingKey:路由鍵,生產者發送消息到交換器通常指定RoutingKey,用戶消息的路由,而這個RoutingKey須要與交換器和綁定鍵(Bindingkey)聯合使用有效。聯合使用即路由規則,決定消息流向哪裏
Binding:綁定,將交換器和隊列管理起來,在綁定的時候通常會指定一個綁定鍵(Bindingkey)
Connection/Channel
與RabbitMQ Broker創建鏈接,實則創建了一條TCP鏈接,也就是Connection,鏈接創建好了,就能夠建立AMQP信道(Channel),每一個信道都會被指派一個惟一的ID,信道創建在Connection上的虛擬鏈接,RabbitMQ處理的每條AMQP指定都是經過信道完成的。
引入信道的緣由:建立一個TCP鏈接開啓昂貴,在使用高峯時出現性能瓶頸,隨即RabbitMQ採用NIO(Non-Blocking I/0)的作法,選擇TCP鏈接複用,這樣不只減小開銷,也方便管理。因爲信道是非現場安全的,全部每一個線程都應把持一個惟一的信道,從而複用Connection的TCP鏈接