溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么掌握Rabbitmq

發(fā)布時間:2021-12-24 09:19:24 來源:億速云 閱讀:129 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“怎么掌握Rabbitmq”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么掌握Rabbitmq”吧!

RabbitMQ 是功能強大的開源消息代理。根據(jù)官網(wǎng)稱:也是使用量最廣泛的消息隊列。就像他的口號“Messaging that just works”,開箱即用使用簡單,支持多種消息傳輸協(xié)議(AMQP、STOMP、MQTT)。

一個應(yīng)用程序或者服務(wù)如何使用RabbitMq呢?

首先會有生產(chǎn)者和消費者兩個角色;生產(chǎn)者連接到rabbit代理服務(wù),創(chuàng)建一條AMQP信道,然后把生成的消息,通過信道發(fā)布到交換器上,交換器根據(jù)路由規(guī)則(路由key)進行綁定到或者路由到隊列上面。最后消息到達隊列上中。消費者跟生產(chǎn)者一樣需要先和rabbit代理服務(wù)器創(chuàng)建連接,同時創(chuàng)建一個消息管道,并訂閱到隊列上,進而從隊列中獲取消息,進行處理。這里面涉及到   消息   、   交換器   、   綁定   、   隊列   幾個重要的概念,下面會一一講解。整個過程如圖所示  

 

怎么掌握Rabbitmq


消息

生產(chǎn)者創(chuàng)建消息,這里的消息是指?消息包含兩個部分內(nèi)容:   有效載荷   (payload)、   標簽   (label)。有效載荷就是你想要傳輸?shù)臄?shù)據(jù)。而標簽是描述了有效載荷,并且RabbitMQ用它來決定誰將獲得消息的拷貝。其實通過上圖你也會發(fā)現(xiàn),不同于tcp協(xié)議,因為AMQP沒有明確的接收方,只會用標簽表述這條消息,然后把消息交給Rabbit。rabbit會根據(jù)標簽把消息發(fā)送給感興趣的接收方。  


隊列

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

  注意:什么時候消息才會從隊列中刪除呢?這里涉及到一個消息確認的動作。消費者接收到的每一條消息都必須進行確認。才會從隊列中刪除。消費者可以通過AMQP的Basic.Ack命令顯式地向rabbtmq發(fā)送一個確認,或者在訂閱到隊列的時候就將autoAck屬性設(shè)置為true;如:autoAck: true,一旦消費者接收消息,rabbitmq會自動視其確認了消息。  
 

怎么掌握Rabbitmq

如果消費者接收到消費1,然后在確認之前從rabbit斷開連接,rabbitmq會認為這條消息沒有分發(fā),然后重新分發(fā)下一個訂閱的消費者。這樣做的好處,即使你的應(yīng)用程序奔潰了,也可以確保消息會被發(fā)送給另一個消費者進行處理,或者等待你的程序恢復(fù)正常連接,繼續(xù)消費。假設(shè)消費者A程序與rabbit斷開了連接,消息進而會被消費者B進行消費處理。如下圖
 

怎么掌握Rabbitmq

只要消費者不進行確認,rabbit將不會給該消費者發(fā)送消息,因為在上一條消息被確認之前,rabbit會認為這個消費者并沒有準備好接收下一條消息的能力。

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

如果你檢測到一條消息本身有錯誤而任何一個消費者都無法處理的時候,就可以把requeue設(shè)置為false,rabbitmq會把消息從隊里中移除,而不會把他發(fā)送給新的消費者。
注意:這里你可以使用對拒絕的消息進行特殊處理,比如發(fā)送到死信隊列或者專門收集的erro隊里中。


小結(jié):隊列是amqp消息通信的基礎(chǔ)模塊

1.為消息提供的處所,消息在此等待消費
2.對負載均衡來說,隊列是絕佳方案。只需附加一堆消費者,并讓rabbitmq以循環(huán)的方式均勻地分配發(fā)來的消息。
3.隊列是rabbit中消息的最后的終點。


交換器、綁定

我們知道消費者如何獲取消息,那么現(xiàn)在的問題是,消息是如何到達隊列的呢?消息發(fā)送到交換器,會根據(jù)確定的規(guī)則,RabbitMQ將會決定消息該投遞到哪個隊列。這些規(guī)則稱為   路由鍵   (routing key)。隊列通過路由鍵綁定到交換器。當你發(fā)送消息到代理服務(wù)器時,消息將擁有一個路由鍵。如:AMPQ的   Basic.Publish   方法,有個參數(shù)routingKey通過他指定。即便是空的,RabbitMQ也會將其和綁定使用的路由鍵進行匹配。

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

怎么掌握Rabbitmq

 
 
默認的direct交換器,不需要進行聲明, 隊列聲明會自動綁定到默認的交換器上,并以隊列名稱作為路右鍵。使用以下代碼發(fā)送消息申明的隊列中。  


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


2.fanout交換器

這種模式下,可以忽略routing key,唯一需要做的就是為新的消費者寫一段代碼,然后聲明新的隊列并將其綁定到fanout交換器上。當你發(fā)送一條消息到fanout交換器上,他會把消息投遞給所有附加在此交換器的隊里上。   路由算法   -消息會路由到綁定到交換器上的所有隊列。   使用場景   -發(fā)布訂閱的廣播功能  

怎么掌握Rabbitmq


2.topic交換器

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

怎么掌握Rabbitmq

感謝各位的閱讀,以上就是“怎么掌握Rabbitmq”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對怎么掌握Rabbitmq這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI