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
交換機,決定了訊息路由規則,但是它不會儲存,生產者塞進來資料時,如果沒有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: