1. 程式人生 > 實用技巧 >RabbitMQ基礎

RabbitMQ基礎

什麼是訊息中介軟體

MQ全稱為Message Queue,訊息佇列是應用程式和應用程式之間的通訊方法。

從字面意思上看,本質是個佇列,FIFO先入先出,只不過佇列中存放的內容是message而已。

其主要用途:不同程序Process/執行緒Thread之間通訊。

1、應用程式解耦合

MQ相當於一箇中介,生產方通過MQ與消費方互動,它將應用程式進行解耦合。

2、任務非同步處理

將不需要同步處理的並且耗時長的操作由訊息佇列通知訊息接收方進行非同步處理。提高了應用程式的響應時間。

3、削峰填谷

如訂單系統,在下單的時候就會往資料庫寫資料。但是資料庫只能支撐每秒1000左右的併發寫入,併發量再高就容易宕機。
低峰期的時候併發也就100多個,但是在高峰期時候,併發量會突然激增到5000以上,這個時候資料庫肯定卡死了。
訊息被MQ儲存起來了,然後系統就可以按照自己的消費能力來消費,比如每秒1000個數據,這樣慢慢寫入資料庫,這樣就不會卡死資料庫了。
但是使用了MQ之後,限制消費訊息的速度為1000,但是這樣一來,高峰期產生的資料勢必會被積壓在MQ中,高峰就被“削”掉了。但是因為訊息積壓,
在高峰期過後的一段時間內,消費訊息的速度還是會維持在1000QPS,直到消費完積壓的訊息,這就叫做“填谷”

常見訊息佇列產品

  • ActiveMQ:基於JMS
  • ZeroMQ:基於C語言開發
  • RabbitMQ:基於AMQP協議,erlang語言開發,穩定性好
  • RocketMQ:基於JMS,阿里巴巴產品
  • Kafka:類似MQ的產品;分散式訊息系統,高吞吐量

RabbitMQ

  RabbitMQ是由erlang語言開發,基於AMQP(Advanced Message Queue 高階訊息佇列協議)協議實現的訊息佇列,

它是一種應用程式之間的通訊方法,訊息佇列在分散式系統開發中應用非常廣泛。

RabbitMQ官方地址:http://www.rabbitmq.com/

RabbitMQ提供了6種模式:

  • 簡單模式,
  • work模式,
  • Publish/Subscribe釋出與訂閱模式,
  • Routing路由模式,
  • Topics主題模式,
  • RPC遠端呼叫模式(遠端呼叫,不太算MQ);

官網對應模式介紹:https://www.rabbitmq.com/getstarted.html

RabbitMQ 基礎架構如下圖:

RabbitMQ 中的相關概念:

AMQP 一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。

AMQP是一個二進位制協議,擁有一些現代化特點:多通道、協商式,非同步,安全,擴平臺,中立,高效。

  RabbitMQ是AMQP協議的Erlang的實現。

Connection連線:一個網路連線,比如TCP/IP套接字連線。

Session會話:端點之間的命名對話。在一個會話上下文中,保證“恰好傳遞一次”。

Channel通道:多路複用連線中的一條獨立的雙向資料流通道。為會話提供物理傳輸介質。

Client客戶端:AMQP連線或者會話的發起者。AMQP是非對稱的,客戶端生產和消費訊息,伺服器儲存和路由這些訊息。

Broker服務節點:訊息中介軟體的服務節點;一般情況下可以將一個RabbitMQ Broker看作一臺RabbitMQ 伺服器。

端點:AMQP對話的任意一方。一個AMQP連線包括兩個端點(一個是客戶端,一個是伺服器)。

Consumer消費者:一個從訊息佇列裡請求訊息的客戶端程式。

Producer生產者:一個向交換機發布訊息的客戶端應用程式。

RabbitMQ運轉流程

在入門案例中:

生產者傳送訊息
1、生產者建立連線(Connection),開啟一個通道(Channel),連線到RabbitMQ Broker;
2、宣告佇列並設定屬性;如是否排它,是否持久化,是否自動刪除;
3、將路由鍵(空字串)與佇列繫結起來;
4、傳送訊息至RabbitMQ Broker;
5、關閉通道;
6、關閉連線;
消費者接收訊息
1、消費者建立連線(Connection),開啟一個通道(Channel),連線到RabbitMQ Broker
2、向Broker 請求消費相應佇列中的訊息,設定相應的回撥函式;
3、等待Broker迴應閉關投遞響應佇列中的訊息,消費者接收訊息;
4、確認(ack,自動確認)接收到的訊息;
5、RabbitMQ從佇列中刪除相應已經被確認的訊息;
6、關閉通道;
7、關閉連線;

一、簡單模式:

  • P:生產者,也就是要傳送訊息的程式
  • C:消費者:訊息的接受者,會一直等待訊息到來。
  • queue:訊息佇列,圖中紅色部分。類似一個郵箱,可以快取訊息;生產者向其中投遞訊息,消費者從其中取出訊息。

二、Work queues工作佇列模式

Work Queues與入門程式的簡單模式相比,多了一個或一些消費端,多個消費端共同消費同一個佇列中的訊息。

應用場景:對於 任務過重或任務較多情況使用工作佇列可以提高任務處理的速度。

小結:在一個佇列中如果有多個消費者,那麼消費者之間對於同一個訊息的關係是**競爭**的關係。

訂閱模式型別

前面2個案例中,只有3個角色:

  • P:生產者,也就是要傳送訊息的程式
  • C:消費者:訊息的接受者,會一直等待訊息到來。
  • queue:訊息佇列,圖中紅色部分

而在訂閱模型中,多了一個exchange角色,而且過程略有變化:

  • P:生產者,也就是要傳送訊息的程式,但是不再發送到佇列中,而是發給X(交換機)
  • C:消費者,訊息的接受者,會一直等待訊息到來。
  • Queue:訊息佇列,接收訊息、快取訊息。
  • Exchange:交換機,圖中的X。一方面,接收生產者傳送的訊息。另一方面,知道如何處理訊息,例如遞交給某個特別佇列、遞交給所有佇列、或是將訊息丟棄。到底如何操作,取決於Exchange的型別。Exchange有常見以下3種類型:
  • Fanout:廣播,將訊息交給所有繫結到交換機的佇列
  • Direct:定向,把訊息交給符合指定routing key 的佇列
  • Topic:萬用字元,把訊息交給符合routing pattern(路由模式) 的佇列

Exchange(交換機)只負責轉發訊息,不具備儲存訊息的能力,因此如果沒有任何佇列與Exchange繫結,

或者沒有符合路由規則的佇列,那麼訊息會丟失!

三、Publish/Subscribe釋出與訂閱模式

釋出訂閱模式:
1、每個消費者監聽自己的佇列。
2、生產者將訊息發給broker,由交換機將訊息轉發到繫結此交換機的每個佇列,每個繫結交換機的佇列都將接收到訊息

四、Routing路由模式

  • 佇列與交換機的繫結,不能是任意綁定了,而是要指定一個RoutingKey(路由key)
  • 訊息的傳送方在 向 Exchange傳送訊息時,也必須指定訊息的RoutingKey
  • Exchange不再把訊息交給每一個繫結的佇列,而是根據訊息的Routing Key進行判斷,只有佇列的Routingkey與訊息的Routing key完全一致,才會接收到訊息

圖解:

  • P:生產者,向Exchange傳送訊息,傳送訊息時,會指定一個routing key。
  • X:Exchange(交換機),接收生產者的訊息,然後把訊息遞交給 與routing key完全匹配的佇列
  • C1:消費者,其所在佇列指定了需要routing key 為 error 的訊息
  • C2:消費者,其所在佇列指定了需要routing key 為 info、error、warning 的訊息

小結:Routing模式要求佇列在繫結交換機時要指定routing key,訊息會轉發到符合routing key的佇列。

五、Topics萬用字元模式

圖解:

  • 紅色Queue:繫結的是usa.#,因此凡是以usa.開頭的routing key都會被匹配到
  • 黃色Queue:繫結的是#.news,因此凡是以.news結尾的routing key都會被匹配

模式總結

RabbitMQ工作模式:
1、簡單模式 HelloWorld
一個生產者、一個消費者,不需要設定交換機(使用預設的交換機)

2、工作佇列模式 Work Queue
一個生產者、多個消費者(競爭關係),不需要設定交換機(使用預設的交換機)

3、釋出訂閱模式 Publish/subscribe
需要設定型別為fanout的交換機,並且交換機和佇列進行繫結,當傳送訊息到交換機後,交換機會將訊息傳送到繫結的佇列

4、路由模式 Routing
需要設定型別為direct的交換機,交換機和佇列進行繫結,並且指定routing key,當傳送訊息到交換機後,交換機會根據routing key將訊息傳送到對應的佇列

5、萬用字元模式 Topic
需要設定型別為topic的交換機,交換機和佇列進行繫結,並且指定萬用字元方式的routing key,當傳送訊息到交換機後,交換機會根據routing key將訊息傳送到對應的佇列