久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

RabbitMQ面試要點有哪些

199次閱讀
沒有評論

共計 2423 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章主要為大家展示了“RabbitMQ 面試要點有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領大家一起研究并學習一下“RabbitMQ 面試要點有哪些”這篇文章吧。

1. 如何確保消息正確地發(fā)送至 RabbitMQ?

RabbitMQ 使用發(fā)送方確認模式,確保消息正確地發(fā)送到 RabbitMQ。

發(fā)送方確認模式:將信道設置成 confirm 模式(發(fā)送方確認模式),則所有在信道上發(fā)布的消息都會被指派一個唯一的 ID。一旦消息被投遞到目的隊列后,或者消息被寫入磁盤后(可持久化的消息),信道會發(fā)送一個確認給生產者(包含消息唯一 ID)。如果 RabbitMQ 發(fā)生內部錯誤從而導致消息丟失,會發(fā)送一條 nack(not acknowledged,未確認)消息。

發(fā)送方確認模式是異步的,生產者應用程序在等待確認的同時,可以繼續(xù)發(fā)送消息。當確認消息到達生產者應用程序,生產者應用程序的回調方法就會被觸發(fā)來處理確認消息。

 2. 如何確保消息接收方消費了消息?

接收方消息確認機制:消費者接收每一條消息后都必須進行確認(消息接收和消息確認是兩個不同操作)。只有消費者確認了消息,RabbitMQ 才能安全地把消息從隊列中刪除。

這里并沒有用到超時機制,RabbitMQ 僅通過 Consumer 的連接中斷來確認是否需要重新發(fā)送消息。也就是說,只要連接不中斷,RabbitMQ 給了 Consumer 足夠長的時間來處理消息。

下面羅列幾種特殊情況:

如果消費者接收到消息,在確認之前斷開了連接或取消訂閱,RabbitMQ 會認為消息沒有被分發(fā),然后重新分發(fā)給下一個訂閱的消費者。

(可能存在消息重復消費的隱患,需要根據(jù) bizId 去重)

如果消費者接收到消息卻沒有確認消息,連接也未斷開,則 RabbitMQ 認為該消費者繁忙,將不會給該消費者分發(fā)更多的消息。

 3. 如何避免消息重復投遞或重復消費?

在消息生產時,MQ 內部針對每條生產者發(fā)送的消息生成一個 inner-msg-id,作為去重和冪等的依據(jù)(消息投遞失敗并重傳),避免重復的消息進入隊列;在消息消費時,要求消息體中必須要有一個 bizId(對于同一業(yè)務全局唯一,如支付 ID、訂單 ID、帖子 ID 等)作為去重和冪等的依據(jù),避免同一條消息被重復消費。

 4. 消息基于什么傳輸?

由于 TCP 連接的創(chuàng)建和銷毀開銷較大,且并發(fā)數(shù)受系統(tǒng)資源限制,會造成性能瓶頸。RabbitMQ 使用信道的方式來傳輸數(shù)據(jù)。信道是建立在真實的 TCP 連接內的虛擬連接,且每條 TCP 連接上的信道數(shù)量沒有限制。

 5. 消息如何分發(fā)?

若該隊列至少有一個消費者訂閱,消息將以循環(huán)(round-robin)的方式發(fā)送給消費者。每條消息只會分發(fā)給一個訂閱的消費者(前提是消費者能夠正常處理消息并進行確認)。

 6. 消息怎么路由?

從概念上來說,消息路由必須有三部分:交換器、路由、綁定。生產者把消息發(fā)布到交換器上;綁定決定了消息如何從路由器路由到特定的隊列;消息最終到達隊列,并被消費者接收。

消息發(fā)布到交換器時,消息將擁有一個路由鍵(routing key),在消息創(chuàng)建時設定。

通過隊列路由鍵,可以把隊列綁定到交換器上。

消息到達交換器后,RabbitMQ 會將消息的路由鍵與隊列的路由鍵進行匹配(針對不同的交換器有不同的路由規(guī)則)。

如果能夠匹配到隊列,則消息會投遞到相應隊列中;

如果不能匹配到任何隊列,消息將進入“黑洞”。

常用的交換器主要分為一下三種:

direct:

如果路由鍵完全匹配,消息就被投遞到相應的隊列

fanout:

如果交換器收到消息,將會廣播到所有綁定的隊列上

topic:

可以使來自不同源頭的消息能夠到達同一個隊列。

使用 topic 交換器時,可以使用通配符,比如:

“*”匹配特定位置的任意文本,“.”把路由鍵分為了幾部分,“#”匹配所有規(guī)則等。

特別注意:

發(fā)往 topic 交換器的消息不能隨意的設置選擇鍵(routing_key),必須是由 . 隔開的一系列的標識符組成。

 7. 如何確保消息不丟失?

消息持久化的前提是:將交換器 / 隊列的 durable 屬性設置為 true,表示交換器 / 隊列是持久交換器 / 隊列,在服務器崩潰或重啟之后不需要重新創(chuàng)建交換器 / 隊列(交換器 / 隊列會自動創(chuàng)建)。

如果消息想要從 Rabbit 崩潰中恢復,那么消息必須:

在消息發(fā)布前,通過把它的“投遞模式”選項設置為 2(持久)來把消息標記成持久化

將消息發(fā)送到持久交換器

消息到達持久隊列

RabbitMQ 確保持久性消息能從服務器重啟中恢復的方式是,將它們寫入磁盤上的一個持久化日志文件,當發(fā)布一條持久性消息到持久交換器上時,Rabbit 會在消息提交到日志文件后才發(fā)送響應(如果消息路由到了非持久隊列,它會自動從持久化日志中移除)。一旦消費者從持久隊列中消費了一條持久化消息,RabbitMQ 會在持久化日志中把這條消息標記為等待垃圾收集。如果持久化消息在被消費之前 RabbitMQ 重啟,那么 Rabbit 會自動重建交換器和隊列(以及綁定),并重播持久化日志文件中的消息到合適的隊列或者交換器上。

 8. 使用 RabbitMQ 有什么好處?

應用解耦(系統(tǒng)拆分)

異步處理(預約掛號業(yè)務處理成功后,異步發(fā)送短信、推送消息、日志記錄等)

消息分發(fā)

流量削峰

消息緩沖

……

 9. 其他

RabbitMQ 是 消息投遞服務,在應用程序和服務器之間扮演路由器的角色,而應用程序或服務器可以發(fā)送和接收包裹。其通信方式是一種“發(fā)后即忘(fire-and-forget)”的單向方式。

其中消息包含兩部分內容:有效載荷(payload)和標簽(label)。

有效載荷是需要傳輸?shù)臄?shù)據(jù),可以是任意內容。

標簽描述了有效載荷,RabbitMQ 會根據(jù)標簽的描述,把消息發(fā)送給感興趣的接收方。

以上是“RabbitMQ 面試要點有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業(yè)資訊頻道!

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-08-16發(fā)表,共計2423字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網(wǎng)絡搜集發(fā)布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 洪江市| 蒲城县| 阿勒泰市| 鹤峰县| 从化市| 安新县| 聂拉木县| 郴州市| 遵化市| 万全县| 仲巴县| 安宁市| 黄梅县| 东海县| 玉山县| 二连浩特市| 岗巴县| 奈曼旗| 甘肃省| 博爱县| 平乡县| 平塘县| 高青县| 晴隆县| 上栗县| 离岛区| 苏尼特左旗| 民勤县| 勃利县| 边坝县| 桦川县| 林西县| 突泉县| 肥乡县| 浦东新区| 綦江县| 小金县| 景东| 东乡族自治县| 叶城县| 富蕴县|