1、消息隊列
消息隊列是一種應用間通信的方式。應用A只關心往隊列中塞入消息,應用B只關心從隊列中中讀取消息。是一種解耦合的常用手段。
消息隊列是一種異步通信模式。降低接口響應時間,提高服務性能。最常見的使用場景就是下單、減庫存。如果是同步模式,接口響應時間=下單+庫存。用了消息隊列之後,接口響應時間=下單,基本上是提高了一倍的性能。
2、 AMQP
RabbitMQ是一個由elrang開發AMQP的開源實現
AMQP:Advanced Message Queue Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,而無需關注語言限制,具有很好的跨平臺性。
3、RabbitMQ
特點:
- 可靠性。使用了持久化、傳輸確認、發送確認機制來保證消息的可靠性
- 靈活的路由。提供了多種類型的exchange,用戶可以根據自己的需要選擇使用
- 跨平臺行。無視客戶端語言的限制
- 高可用。提供了鏡像隊列,來保證消息的有效性
- 集羣模式
- 多種協議。比如STOMP、MQTT等
- ...
如下是兩張RabbitMQ的簡易架構圖
3.1、基本概念
message:MQ通訊消息報文
publisher:消息生產者,負責產生消息的客戶端程序
broker:簡單來說就是消息隊列服務器實體
exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
Virtual Host:虛擬主機,一個broker裏可以開設多個vhost,用作不同用戶的權限分離。
channel:消息通道,在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務。
consumer:消息消費者,負責處理消息的客戶端程序
3.2、消息隊列的使用過程如下:
(1)客戶端連接到消息隊列服務器,打開一個channel。
(2)客戶端聲明一個exchange,並設置相關屬性。
(3)客戶端聲明一個queue,並設置相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關係。
(5)客戶端投遞消息到exchange。
exchange收到消息後,就根據消息的routingKey路由到某個queue。
3.3、exchange類型
MQ的消息是發送到exchange,由exchange根據routingKey進行路由轉發。不同類型的exchange,擁有不同的轉發策略。
3.3.1、direct
只有在key完全匹配的時候,纔會進行轉發。比如:只有在key=abc時,纔會路由到queue1;只有在key=def時,纔會路由到queue2
3.3.2、fanout
如其名廣播模式。該類型是不關注key的,只要有queue被binding在該exchange上,則該queue就能接受發送到該exchange上的消息
3.3.3、topic
類似一種正則匹配模式。符號”#”匹配一個或多個詞,符號”*”匹配正好一個詞。比如:”abc.#”匹配”abc.def.ghi”,”def.*”只匹配”def.abc”。在
key=abc.def.ghi時,消息路由到queue1;在key=def.abc時,消息路由到queue2。
3.4、消息的持久化
RabbitMQ支持持久化操作,也就是把數據寫在磁盤中,預防數據丟失。 如果不做持久化操作,在服務重啓後,之前未來得及處理的數據就丟失了。
消息隊列持久化分爲三個部分:
- exchange持久化,聲明時設置durable=true
- queue持久化,聲明時設置durable=true
- message持久化,發送消息時指定delivery_model = 2
如果exchange和queue都是持久化的,那麼它們之前的binding也是持久化的。如果一個是持久化,一個是非持久化,這種狀態是不允許進行binding操作的。
後續,敬請期待!!!