掌握Rabbitmq幾個重要概念,從一條消息提及

RabbitMQ 是功能強大的開源消息代理。根據官網稱:也是使用量最普遍的消息隊列。就像他的口號「Messaging that just works」,開箱即用使用簡單,支持多種消息傳輸協議(AMQP、STOMP、MQTT)。算法


一個應用程序或者服務如何使用RabbitMq呢?服務器

首先會有生產者和消費者兩個角色;生產者鏈接到rabbit代理服務,建立一條AMQP信道,而後把生成的消息,經過信道發佈到交換器上,交換器根據路由規則(路由key)進行綁定到或者路由到隊列上面。最後消息到達隊列上中。消費者跟生產者同樣須要先和rabbit代理服務器建立鏈接,同時建立一個消息管道,並訂閱到隊列上,進而從隊列中獲取消息,進行處理。這裏面涉及到 消息 交換器 綁定 隊列 幾個重要的概念,下面會一一講解。整個過程如圖所示


消息微信

生產者建立消息,這裏的消息是指?消息包含兩個部份內容: 有效載荷 (payload)、 標籤 (label)。有效載荷就是你想要傳輸的數據。而標籤是描述了有效載荷,而且RabbitMQ用它來決定誰將得到消息的拷貝。其實經過上圖你也會發現,不一樣於tcp協議,由於AMQP沒有明確的接收方,只會用標籤表述這條消息,而後把消息交給Rabbit。rabbit會根據標籤把消息發送給感興趣的接收方。


隊列負載均衡

消息最終到達隊列中並等待消費。消費者經過AMQP的 Basic.Consume 命令訂閱。這樣作會將信道設置爲接受模式,直到取消對隊列的訂閱爲止。訂閱以後,消費者在消費(或者拒絕)最近的接收的那條消息以後,就能從隊列中自動的接收下一條消息。

注意:何時消息纔會從隊列中刪除呢?這裏涉及到一個消息確認的動做。消費者接收到的每一條消息都必須進行確認。纔會從隊列中刪除。消費者能夠經過AMQP的Basic.Ack命令顯式地向rabbtmq發送一個確認,或者在訂閱到隊列的時候就將autoAck屬性設置爲true;如:autoAck: true,一旦消費者接收消息,rabbitmq會自動視其確認了消息。

若是消費者接收到消費1,而後在確認以前從rabbit斷開鏈接,rabbitmq會認爲這條消息沒有分發,而後從新分發下一個訂閱的消費者。這樣作的好處,即便你的應用程序奔潰了,也能夠確保消息會被髮送給另外一個消費者進行處理,或者等待你的程序恢復正常鏈接,繼續消費。假設消費者A程序與rabbit斷開了鏈接,消息進而會被消費者B進行消費處理。以下圖

只要消費者不進行確認,rabbit將不會給該消費者發送消息,由於在上一條消息被確認以前,rabbit會認爲這個消費者並無準備好接收下一條消息的能力。

在沒有辦法正常確認消息,不能一直堵塞呀,好比消費者有bug。那就使用AMPQ的
Basic.Reject命令;明確的拒絕這條消息,其中一個參數requeue若是設置了ture的話,Rabbit會把消息從新發給下一個訂閱的消費者。

若是你檢測到一條消息自己有錯誤而任何一個消費者都沒法處理的時候,就能夠把requeue設置爲false,rabbitmq會把消息從隊裏中移除,而不會把他發送給新的消費者。
注意:這裏你可使用對拒絕的消息進行特殊處理,好比發送到死信隊列或者專門收集的erro隊裏中。tcp


小結:隊列是amqp消息通訊的基礎模塊url

1.爲消息提供的處所,消息在此等待消費
2.對負載均衡來講,隊列是絕佳方案。只需附加一堆消費者,並讓rabbitmq以循環的方式均勻地分配發來的消息。
3.隊列是rabbit中消息的最後的終點。
spa


交換器、綁定.net

咱們知道消費者如何獲取消息,那麼如今的問題是,消息是如何到達隊列的呢?消息發送到交換器,會根據肯定的規則,RabbitMQ將會決定消息該投遞到哪一個隊列。這些規則稱爲 路由鍵 (routing key)。隊列經過路由鍵綁定到交換器。當你發送消息到代理服務器時,消息將擁有一個路由鍵。如:AMPQ的 Basic.Publish 方法,有個參數routingKey經過他指定。即使是空的,RabbitMQ也會將其和綁定使用的路由鍵進行匹配。

交換器有四種類型:direct、fanout、topic和headers;每種類型實現了不一樣的路由算法,前三個比較經常使用。
1.direct
這種模式很是簡單:路由鍵匹配的話,消息就被投遞到對應的隊列。 路由算法 -使用路由鍵和隊列名稱同名進行路由消息。 使用場景 -直接把消息發送到指定隊列時使用。


默認的direct交換器,不須要進行聲明, 隊列聲明會自動綁定到默認的交換器上,並以隊列名稱做爲路右鍵。使用如下代碼發送消息申明的隊列中。

channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);


2.fanout交換器代理

這種模式下,能夠忽略routing key,惟一須要作的就是爲新的消費者寫一段代碼,而後聲明新的隊列並將其綁定到fanout交換器上。當你發送一條消息到fanout交換器上,他會把消息投遞給全部附加在此交換器的隊裏上。 路由算法 -消息會路由到綁定到交換器上的全部隊列。 使用場景 -發佈訂閱的廣播功能

2.topic交換器code

這類交換器容許不一樣源頭的消息到達同一個隊列。路由算法-根據所有或部分路由鍵匹配將消息路由綁定的隊列上。使用場景-根據某些條件廣播到特定的隊列上。

小結:

本文主要總結了 apmq幾個主要元素:交換器,綁定,隊列。以及一個消息建立到消費者讀取消費的過程。 

本文分享自微信公衆號 - dotNET知音(AAshiyou)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索