異步通信rabbitmq

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操作的。

後續,敬請期待!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章