這篇文章將為大家詳細(xì)講解有關(guān)RabbitMQ的面試題有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
為召陵等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及召陵網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、召陵網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!一、什么是RabbitMQ?
采用AMQP高級(jí)消息隊(duì)列協(xié)議的一種消息隊(duì)列技術(shù),大的特點(diǎn)就是消費(fèi)并不需要確保提供方存在,實(shí)現(xiàn)了服務(wù)之間的高度解耦。
二、為什么要使用RabbitMQ?
①在分布式系統(tǒng)下具備異步,削峰,負(fù)載均衡等一系列高級(jí)功能;
②擁有持久化的機(jī)制,進(jìn)程消息,隊(duì)列中的信息也可以保存下來(lái)。
③實(shí)現(xiàn)消費(fèi)者和生產(chǎn)者之間的解耦。
④對(duì)于高并發(fā)場(chǎng)景下,利用消息隊(duì)列可以使得同步訪問(wèn)變?yōu)榇性L問(wèn)達(dá)到一定量的限流,利于數(shù)據(jù)庫(kù)的操作。
⑤可以使用消息隊(duì)列達(dá)到異步下單的效果,排隊(duì)中,后臺(tái)進(jìn)行邏輯下單。
三、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)消息,只是扮演“快遞”的角色。
五、如何確保消息正確地發(fā)送至RabbitMQ?如何確保消息接收方消費(fèi)了消息?
1、發(fā)送方確認(rèn)模式
①將信道設(shè)置成confirm模式(發(fā)送方確認(rèn)模式),則所有在信道上發(fā)布的消息都會(huì)被指派一個(gè)唯一的ID。
②一旦消息被投遞到目的隊(duì)列后,或者消息被寫(xiě)入磁盤后(可持久化的消息),信道會(huì)發(fā)送一個(gè)確認(rèn)給生產(chǎn)者(包含消息唯一 ID)。
③如果RabbitMQ發(fā)生內(nèi)部錯(cuò)誤從而導(dǎo)致消息丟失,會(huì)發(fā)送一條 nack(notacknowledged,未確認(rèn))消息。
④發(fā)送方確認(rèn)模式是異步的,生產(chǎn)者應(yīng)用程序在等待確認(rèn)的同時(shí),可以繼續(xù)發(fā)送消息。當(dāng)確認(rèn)消息到達(dá)生產(chǎn)者應(yīng)用程序,生產(chǎn)者應(yīng)用程序的回調(diào)方法就會(huì)被觸發(fā)來(lái)處理確認(rèn)消息。
2、接收方確認(rèn)機(jī)制
①消費(fèi)者接收每一條消息后都必須進(jìn)行確認(rèn)(消息接收和消息確認(rèn)是兩個(gè)不同操作)。只有消費(fèi)者確認(rèn)了消息,RabbitMQ 才能安全地把消息從隊(duì)列中刪除。
②這里并沒(méi)有用到超時(shí)機(jī)制,RabbitMQ僅通過(guò)Consumer的連接中斷來(lái)確認(rèn)是否需要重新發(fā)送消息。也就是說(shuō),只要連接不中斷,RabbitMQ給了Consumer足夠長(zhǎng)的時(shí)間來(lái)處理消息。保證數(shù)據(jù)的最終一致性。
3、下面羅列幾種特殊情況
①如果消費(fèi)者接收到消息,在確認(rèn)之前斷開(kāi)了連接或取消訂閱,RabbitMQ會(huì)認(rèn)為消息沒(méi)有被分發(fā),然后重新分發(fā)給下一個(gè)訂閱的消費(fèi)者。(可能存在消息重復(fù)消費(fèi)的隱患,需要去重)
②如果消費(fèi)者接收到消息卻沒(méi)有確認(rèn)消息,連接也未斷開(kāi),則RabbitMQ認(rèn)為該消費(fèi)者繁忙,將不會(huì)給該消費(fèi)者分發(fā)更多的消息。
六、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而非內(nèi)存存儲(chǔ),從而降低了吞吐量??杀M量使用ssd硬盤來(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中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中)。
關(guān)于“RabbitMQ的面試題有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。