面試官常問的 微服務 問題(八)

71.如何避免消息重複投遞或重複消費?

在消息生產時,MQ 內部針對每條生產者發送的消息生成一個 inner-msg-id,作爲去重的依據(消息投遞失敗並重傳),避免重複 的消息進入隊列;

在消息消費時,要求消息體中必須要有一個 bizId(對於同一業務全局唯一,如支付 ID、訂單 ID、帖子 ID 等)作爲去重的依據, 避免同一條消息被重複消費。

72.消息基於什麼傳輸?

由於 TCP 連接的創建和銷燬開銷較大,且併發數受系統資源限制,會造成性能瓶頸。RabbitMQ 使用信道的方式來傳輸數據。信道 是建立在真實的 TCP 連接內的虛擬連接,且每條 TCP 連接上的信道數量沒有限制。

73.消息如何分發?

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

通過路由可實現多消費的功能

74.消息怎麼路由?

消息提供方 -> 路由 -> 一至多個隊列
消息發佈到交換器時,消息將擁有一個路由鍵(routingkey) ,在消息創建時設定。
通過隊列路由鍵,可以把隊列綁定到交換器上。
消息到達交換器後,RabbitMQ 會將消息的路由鍵與隊列的路由鍵進行匹配(針對不同的交換器有不同的路由規則) ;

常用的交換器主要分爲一下三種:
1)fanout:如果交換器收到消息,將會廣播到所有綁定的隊列上
2)direct:如果路由鍵完全匹配,消息就被投遞到相應的隊列
3)topic:可以使來自不同源頭的消息能夠到達同一個隊列。 使用 topic 交換器時,可以使用通配符

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

消息持久化,前提是隊列必須持久化

RabbitMQ 確保持久性消息能從服務器重啓中恢復的方式是,將它們寫入磁盤上的一個持久化日誌文件,當發佈一條持久性消息到 持久交換器上時,Rabbit 會在消息提交到日誌文件後才發送響應。
一旦消費者從持久隊列中消費了一條持久化消息,RabbitMQ 會在持久化日誌中把這條消息標記爲等待垃圾收集。
如果持久化消息 在被消費之前RabbitMQ 重啓,那麼 Rabbit 會自動重建交換器和隊列(以及綁定),並重新發布持久化日誌文件中的消息到合適的隊列。

76.vhost 是什麼?起什麼作用?

vhost 可以理解爲虛擬 broker ,即 mini-RabbitMQserver。其內部均含有獨立的 queue、exchange 和 binding 等,但最最重要的 是,其擁有獨立的權限系統,可以做到 vhost 範圍的用戶控制。當然,從 RabbitMQ 的全局角度,vhost 可以作爲不同權限隔離的手 段(一個典型的例子就是不同的應用可以跑在不同的 vhost 中)。

(個人理解是類似於:當tomcat裏多個項目的主機名有重複的情況時,用vhost不會起衝突)

77.如何設置消息的過期時間?

1)設置隊列屬性,隊列中所有消息都有相同的過期時間
2)對消息本身進行單獨設置,每條消息的 TTL 可以不同
3)如果兩種方法一起使用,則消息的 TTL 以兩者之間較小的那個數值爲準

78.如何實現延時隊列?

使用死信交換機。消息投遞到一個沒有消費者的隊列中,爲這個隊列指定死信隊列,當消息達到設置過期時間還沒有被消費時將
會被髮布到死信隊列中,而消費者訂閱死信隊列直接消費到了一份延時消息。

聲明交換器類型爲 x-delayed-message 來標示此交換機爲延時交換機。

發送消息時在 header 中添加”x-delay”參數來控制消息的延時時間

79.如何指定消息的優先級?

設置隊列的 maxpriority 參數,RabbitMQ 中消息的優先級默認是 0,最大值是 10
(個人理解:優先級只在多條消息同時存在的時候才能體現效果!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章