如果面試問(wèn)?RabbitMQ,你可以吊打他 !

?rabbitmq 的使用場(chǎng)景有哪些?

①. 跨系統(tǒng)的異步通信,所有需要異步交互的地方都可以使用消息隊(duì)列。就像我們除了打電話(同步)以外,還需要發(fā)短信,發(fā)電子郵件(異步)的通訊方式。

②. 多個(gè)應(yīng)用之間的耦合,由于消息是平臺(tái)無(wú)關(guān)和語(yǔ)言無(wú)關(guān)的,而且語(yǔ)義上也不再是函數(shù)調(diào)用,因此更適合作為多個(gè)應(yīng)用之間的松耦合的接口?;谙㈥?duì)列的耦合,不需要發(fā)送方和接收方同時(shí)在線。在企業(yè)應(yīng)用集成(EAI)中,文件傳輸,共享數(shù)據(jù)庫(kù),消息隊(duì)列,遠(yuǎn)程過(guò)程調(diào)用都可以作為集成的方法。

③. 應(yīng)用內(nèi)的同步變異步,比如訂單處理,就可以由前端應(yīng)用將訂單信息放到隊(duì)列,后端應(yīng)用從隊(duì)列里依次獲得消息處理,高峰時(shí)的大量訂單可以積壓在隊(duì)列里慢慢處理掉。由于同步通常意味著阻塞,而大量線程的阻塞會(huì)降低計(jì)算機(jī)的性能。

④. 消息驅(qū)動(dòng)的架構(gòu)(EDA),系統(tǒng)分解為消息隊(duì)列,和消息制造者和消息消費(fèi)者,一個(gè)處理流程可以根據(jù)需要拆成多個(gè)階段(Stage),階段之間用隊(duì)列連接起來(lái),前一個(gè)階段處理的結(jié)果放入隊(duì)列,后一個(gè)階段從隊(duì)列中獲取消息繼續(xù)處理。

⑤. 應(yīng)用需要更靈活的耦合方式,如發(fā)布訂閱,比如可以指定路由規(guī)則。

⑥. 跨局域網(wǎng),甚至跨城市的通訊(CDN行業(yè)),比如北京機(jī)房與廣州機(jī)房的應(yīng)用程序的通信。

?rabbitmq 有哪些重要的角色?

RabbitMQ 中重要的角色有:生產(chǎn)者、消費(fèi)者和代理:

生產(chǎn)者:消息的創(chuàng)建者,負(fù)責(zé)創(chuàng)建和推送數(shù)據(jù)到消息服務(wù)器;

消費(fèi)者:消息的接收方,用于處理數(shù)據(jù)和確認(rèn)消息;

代理:就是 RabbitMQ 本身,用于扮演“快遞”的角色,本身不生產(chǎn)消息,只是扮演“快遞”的角色。

?rabbitmq 有哪些重要的組件?

ConnectionFactory(連接管理器):應(yīng)用程序與Rabbit之間建立連接的管理器,程序代碼中使用。

Channel(信道):消息推送使用的通道。

Exchange(交換器):用于接受、分配消息。

Queue(隊(duì)列):用于存儲(chǔ)生產(chǎn)者的消息。

RoutingKey(路由鍵):用于把生成者的數(shù)據(jù)分配到交換器上。

BindingKey(綁定鍵):用于把交換器的消息綁定到隊(duì)列上。

?rabbitmq 中 vhost 的作用是什么?

vhost 可以理解為虛擬 broker ,即 mini-RabbitMQ? server。其內(nèi)部均含有獨(dú)立的 queue、exchange 和 binding 等,但最最重要的是,其擁有獨(dú)立的權(quán)限系統(tǒng),可以做到 vhost 范圍的用戶控制。當(dāng)然,從 RabbitMQ 的全局角度,vhost 可以作為不同權(quán)限隔離的手段(一個(gè)典型的例子就是不同的應(yīng)用可以跑在不同的 vhost 中)。?

rabbitmq 的消息是怎么發(fā)送的?

首先客戶端必須連接到 RabbitMQ 服務(wù)器才能發(fā)布和消費(fèi)消息,客戶端和 rabbit server 之間會(huì)創(chuàng)建一個(gè) tcp 連接,一旦 tcp 打開(kāi)并通過(guò)了認(rèn)證(認(rèn)證就是你發(fā)送給 rabbit 服務(wù)器的用戶名和密碼),你的客戶端和 RabbitMQ 就創(chuàng)建了一條 amqp 信道(channel),信道是創(chuàng)建在“真實(shí)” tcp 上的虛擬連接,amqp 命令都是通過(guò)信道發(fā)送出去的,每個(gè)信道都會(huì)有一個(gè)唯一的 id,不論是發(fā)布消息,訂閱隊(duì)列都是通過(guò)這個(gè)信道完成的。

rabbitmq 怎么保證消息的穩(wěn)定性?

提供了事務(wù)的功能。

通過(guò)將 channel 設(shè)置為 confirm(確認(rèn))模式。

?rabbitmq 怎么避免消息丟失?

消息持久化

ACK確認(rèn)機(jī)制

設(shè)置集群鏡像模式

消息補(bǔ)償機(jī)制

要保證消息持久化成功的條件有哪些?

聲明隊(duì)列必須設(shè)置持久化 durable 設(shè)置為 true.

消息推送投遞模式必須設(shè)置持久化,deliveryMode 設(shè)置為 2(持久)。

消息已經(jīng)到達(dá)持久化交換器。

消息已經(jīng)到達(dá)持久化隊(duì)列。

以上四個(gè)條件都滿足才能保證消息持久化成功。

rabbitmq 持久化有什么缺點(diǎn)?

持久化的缺地就是降低了服務(wù)器的吞吐量,因?yàn)槭褂玫氖谴疟P(pán)而非內(nèi)存存儲(chǔ),從而降低了吞吐量??杀M量使用 ssd 硬盤(pán)來(lái)緩解吞吐量的問(wèn)題。

rabbitmq 有幾種廣播類型?

三種廣播模式:

fanout: 所有bind到此exchange的queue都可以接收消息(純廣播,綁定到RabbitMQ的接受者都能收到消息);

direct: 通過(guò)routingKey和exchange決定的那個(gè)唯一的queue可以接收消息;

topic:所有符合routingKey(此時(shí)可以是一個(gè)表達(dá)式)的routingKey所bind的queue可以接收消息;

rabbitmq 怎么實(shí)現(xiàn)延遲消息隊(duì)列?

通過(guò)消息過(guò)期后進(jìn)入死信交換器,再由交換器轉(zhuǎn)發(fā)到延遲消費(fèi)隊(duì)列,實(shí)現(xiàn)延遲功能;

使用 RabbitMQ-delayed-message-exchange 插件實(shí)現(xiàn)延遲功能。

?rabbitmq 集群有什么用?

集群主要有以下兩個(gè)用途:

高可用:某個(gè)服務(wù)器出現(xiàn)問(wèn)題,整個(gè) RabbitMQ 還可以繼續(xù)使用;

高容量:集群可以承載更多的消息量。

rabbitmq 節(jié)點(diǎn)的類型有哪些?

磁盤(pán)節(jié)點(diǎn):消息會(huì)存儲(chǔ)到磁盤(pán)。

內(nèi)存節(jié)點(diǎn):消息都存儲(chǔ)在內(nèi)存中,重啟服務(wù)器消息丟失,性能高于磁盤(pán)類型。

rabbitmq 集群搭建需要注意哪些問(wèn)題?

各節(jié)點(diǎn)之間使用“--link”連接,此屬性不能忽略。

各節(jié)點(diǎn)使用的 erlang cookie 值必須相同,此值相當(dāng)于“秘鑰”的功能,用于各節(jié)點(diǎn)的認(rèn)證。

整個(gè)集群中必須包含一個(gè)磁盤(pán)節(jié)點(diǎn)。

rabbitmq 每個(gè)節(jié)點(diǎn)是其他節(jié)點(diǎn)的完整拷貝嗎?為什么?

不是,原因有以下兩個(gè):

存儲(chǔ)空間的考慮:如果每個(gè)節(jié)點(diǎn)都擁有所有隊(duì)列的完全拷貝,這樣新增節(jié)點(diǎn)不但沒(méi)有新增存儲(chǔ)空間,反而增加了更多的冗余數(shù)據(jù);

性能的考慮:如果每條消息都需要完整拷貝到每一個(gè)集群節(jié)點(diǎn),那新增節(jié)點(diǎn)并沒(méi)有提升處理消息的能力,最多是保持和單節(jié)點(diǎn)相同的性能甚至是更糟。

rabbitmq 集群中唯一一個(gè)磁盤(pán)節(jié)點(diǎn)崩潰了會(huì)發(fā)生什么情況?

如果唯一磁盤(pán)的磁盤(pán)節(jié)點(diǎn)崩潰了,不能進(jìn)行以下操作:

不能創(chuàng)建隊(duì)列

不能創(chuàng)建交換器

不能創(chuàng)建綁定

不能添加用戶

不能更改權(quán)限

不能添加和刪除集群節(jié)點(diǎn)

唯一磁盤(pán)節(jié)點(diǎn)崩潰了,集群是可以保持運(yùn)行的,但你不能更改任何東西。

rabbitmq 對(duì)集群節(jié)點(diǎn)停止順序有要求嗎?

RabbitMQ 對(duì)集群的停止的順序是有要求的,應(yīng)該先關(guān)閉內(nèi)存節(jié)點(diǎn),最后再關(guān)閉磁盤(pán)節(jié)點(diǎn)。如果順序恰好相反的話,可能會(huì)造成消息的丟失。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么叫消息隊(duì)列? 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)。消息可以非常簡(jiǎn)單,比如只包含文本字符串,也可以更復(fù)...
    Agile_dev閱讀 2,434評(píng)論 0 24
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 16,208評(píng)論 2 11
  • RabbitMQ 簡(jiǎn)介 MQ 消息隊(duì)列,上承生產(chǎn)者,下接消費(fèi)者。從生產(chǎn)者側(cè)獲取消息,然后將消息轉(zhuǎn)發(fā)給消費(fèi)者。由此可...
    2205閱讀 3,656評(píng)論 1 11
  • 關(guān)于消息隊(duì)列,從前年開(kāi)始斷斷續(xù)續(xù)看了些資料,想寫(xiě)很久了,但一直沒(méi)騰出空,近來(lái)分別碰到幾個(gè)朋友聊這塊的技術(shù)選型,是時(shí)...
    預(yù)流閱讀 586,593評(píng)論 51 787
  • 關(guān)于消息隊(duì)列,從前年開(kāi)始斷斷續(xù)續(xù)看了些資料,想寫(xiě)很久了,但一直沒(méi)騰出空,近來(lái)分別碰到幾個(gè)朋友聊這塊的技術(shù)選型,是時(shí)...
    Johnson_zx閱讀 1,153評(píng)論 0 5

友情鏈接更多精彩內(nèi)容