1. 程式人生 > >RabbitMQ之概念介紹(二)

RabbitMQ之概念介紹(二)

簡介:

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

  其是消費者-生產者模型的一個典型代表,一端往訊息佇列中不斷寫入訊息,另一端不斷讀取/訂閱訊息。

簡單使用場景舉例:

  將專案中無需即時返回且耗時的操作提取出來,進行非同步處理,大大降低了伺服器的請求響應時間。

  如:列印日誌模組無需即時返回,且寫磁碟是一種比較慢的行為,可以將其寫到MQ中,生產者不需要關心是否立馬寫到磁碟。

典型應用場景:

  非同步處理請求:讀寫分離

  應用解耦:生產者消費者讀寫分離

  流量削峰:把流量控制到MQ這一層,不會實際的走到server側

  負載均衡:同一個Queue上的多個消費者被負載均衡(一條訊息只上報給一個人)

  訊息訂閱:根據訂閱資訊自動上報訊息,型別NIO的處理邏輯

幾個重要概念:

Queue

  訊息佇列,其作用是先進先出,儲存來自Producer的訊息,上報訊息給Consumer,多個Producer可以訂閱同一個Queue,但是Queue中的資料之後上報給其中一個人(可以用來做負載均衡),上報完之後資料被丟棄,如果未能上報或者說無Consumer,則該訊息一直存在;

       下圖是簡化版(中間有一層Exchange),C和P一比一,實際有Exchange的存在

     

     下圖時一個生產者對應多個消費者,兩個消費者C1,C2平均每人處理一條P生產的訊息A,B

     

Exchange

  The core idea in the messaging model in RabbitMQ is that the producer never sends any messages directly to a queue.Actually, quite often the producer doesn't even know if a message will be delivered to any queue at all.

  Instead, the producer can only send messages to an exchange

. An exchange is a very simple thing. On one side it receives messages from producers and the other side it pushes them to queues. The exchange must know exactly what to do with a message it receives. Should it be appended to a particular queue? Should it be appended to many queues? Or should it get discarded. The rules for that are defined by the exchange type.

   交換機,決定了訊息路由規則,但是它不會儲存,生產者塞進來資料時,如果沒有Queue bind到Exchange的話,它會直接丟棄Producer傳送過來的訊息;

  上面展示了Queue的大致工作原理,但是實際上P生產的訊息不會直接放到Queue中,而是要經過Exchange,Exchange再將訊息路由到一個或者多個Queue中,不符合路由規則的直接丟棄。(Exchange怎樣確定將訊息路由到哪個佇列或者丟棄的呢?請看下面討論Binding key和exchange type)。

  Exchange有四種類型,不同型別有著不同的策略。Exchange Type如下:

  fanout(廣播):將傳送到該Exchange的訊息路由到所有它直接繫結的Queue中(不關心binding key)

    

 

  direct:把訊息路由到那些binging key和routing key完全匹配的Queue中。

    如下圖:C1訂閱的Queue1使用binging key booking繫結Exchange,那麼P傳送的所有以booking為routing key的訊息都會發送到Queue1中,也會上報給C1.(C2也是如此,因為其也綁定了booking)

    

  topic:topic基本同direct,其區別時direct是完全匹配,topic支援模糊匹配。*用於匹配一個單詞,#用於匹配多個或0個單詞(這裡的單詞指的是以點號分割的,如my.name對應 my name 兩個單詞)

    

    

 

Binding

  Binding是Exchange和Queue之間連線的橋樑。在繫結(Binding)Exchange和Queue的同時,一般指定一個Binging Key。Producer將訊息傳送到Exchange的時候,一般會產生一個Routing Key,當RoutingKey和Binding Key對應上的時候,訊息就會發送到對應的Queue中。

Connection

  一個實際的tcp連線,生產者和消費者都是通過tcp連線到MQ中的。

Channel

  虛擬連線,建立在Connection連線的基礎上,資料流動都是通過Channel來進行的。

  Bind: