分布式面試之RabbitMQ面試題

1蔗包、RabbitMQ中的broker是指什么结笨?cluster又是指什么签夭?

broker是指一個或多個erlang node的邏輯分組昌渤,且node上運行著 RabbitMQ應用程序赴穗。cluster是在broker的基礎之上,增加了 node之間 共享元數據的約束膀息。

2般眉、什么是元數據?元數據分為哪些類型潜支?包括哪些內容甸赃?與cluster相關的元數據有哪些?元數據是如何保存的冗酿?元數據在cluster中是如何分布的埠对?

在非cluster模式下,元數據主要分為Queue元數據(queue名字和屬性 等)裁替、Exchange元數據(exchange名字项玛、類型和屬性等)、Binding元數據 (存放路由關系的查找表)弱判、Vhost元數據(vhost范圍內針對前三者的名字空 間約束和安全屬性設置)襟沮。

在cluster模式下,還包括cluster中node位置信息和node關系信息。元數據按照erlang node的類型確定是僅保存于RAM中开伏,還是同時保存在RAM和disk上膀跌。元數據在cluster中是全node 分布的。

3固灵、RAM node 和 disk node 的區(qū)別捅伤?

RAM node 僅將 fabric(即 queue、exchange 和 binding等 RabbitMQ基礎構 件)相關元數據保存到內存中巫玻,但disk node會在內存和磁盤中均進行存 儲丛忆。RAM node上唯一會存儲到磁盤上的元數據是cluster中使用的disk node的地址。要求在RabbitMQ cluster中至少存在一個disk node大审。

4蘸际、RabbitMQ上的一個queue中存放的message是否有數量限制?

可以認為是無限制徒扶,因為限制取決于機器的內存粮彤,但是消息過多會導致處 理效率的下降。

5姜骡、vhost是什么导坟?起什么作用?

vhost可以理解為虛擬broker 圈澈,即mini-RabbitMQ server惫周。其內部均含有 獨立的queue、exchange和binding等康栈,但最最重要的是递递,其擁有獨立的 權限系統(tǒng),可以做到vhost范圍的用戶控制啥么。當然登舞,從RabbitMQ的全局 角度,vhost可以作為不同權限隔離的手段(一個典型的例子就是不同的應 用可以跑在不同的vhost中)悬荣。

6菠秒、在單node系統(tǒng)和多node構成的cluster系統(tǒng)中聲明queue、exchange氯迂,以及進行binding會有什么不同践叠?

當你在單node上聲明queue時,只要該node上相關元數據進行了變 更嚼蚀,你就會得到Queue.Declare-ok回應禁灼;而在cluster上聲明queue,則要 求cluster上的全部node都要進行元數據成功更新轿曙,才會得到 Queue.Declare-ok回應匾二。另外哮独,若node類型為RAM node則變更的數據 僅保存在內存中,若類型為disk node則還要變更保存在磁盤上的數據察藐。

7、客戶端連接到cluster中的任意node上是否都能正常工作舟扎?

是的分飞。客戶端感覺不到有何不同睹限。

8譬猫、若cluster中擁有某個queue的owner node失效了,且該queue 被聲明具有durable屬性羡疗,是否能夠成功從其他node上重新聲明該 queue 染服?

不能,在這種情況下叨恨,將得到404 NOT_FOUND錯誤柳刮。只能等queue所 屬的node恢復后才能使用該queue。但若該queue本身不具有durable 屬性痒钝,則可在其他node上重新聲明秉颗。

9、cluster中node的失效會對consumer產生什么影響送矩?若是在 cluster 中創(chuàng)建了 mirrored queue蚕甥,這時 node 失效會對 consumer 產生什么影響?

若是consumer所連接的那個node失效(無論該node是否為consumer 所訂閱queue的owner node)栋荸,則consumer會在發(fā)現(xiàn)TCP連接斷開時菇怀, 按標準行為執(zhí)行重連邏輯,并根據“Assume Nothing”原則重建相應的 fabric 即可晌块。若是失效的 node 為 consumer 訂閱 queue 的 o wner node爱沟, 則 consumer 只能通過 Consumer Cancellation Notification 機制來檢測與 該queue訂閱關系的終止,否則會出現(xiàn)傻等卻沒有任何消息來到的問 題摸袁。

10钥顽、能夠在地理上分開的不同數據中心使用RabbitMQ cluster么?

不能靠汁。

第一蜂大,你無法控制所創(chuàng)建的queue實際分布在cluster里的哪個node上 (一般使用HAProxy + cluster模型時都是這樣),這可能會導致各種跨地域 訪問時的常見問題蝶怔;

第二奶浦,Erlang的OTP通信框架對延遲的容忍度有限,這可能會觸發(fā)各種 超時踢星,導致業(yè)務疲于處理澳叉;

第三,在廣域網上的連接失效問題將導致經典的“腦裂"問題,而 RabbitMQ目前無法處理(該問題主要是說Mnesia)成洗。

11五督、為什么heavy RPC的使用場景下不建議采用disk node

heavy RPC是指在業(yè)務邏輯中高頻調用RabbitMQ提供的RPC機制,導 致不斷創(chuàng)建瓶殃、銷毀reply queue充包,進而造成disk node的性能問題(因為會 針對元數據不斷寫盤)。所以在使用RPC機制時需要考慮自身的業(yè)務場景遥椿。

12基矮、向不存在的exchange發(fā)publish消息會發(fā)生什么?向不存在的 queue執(zhí)行c onsume動作會發(fā)生什么冠场?

都會收到ChanneLClose信令告之不存在(內含原因404 NOT_FOUND)家浇。

13、routing_key和binding_key的最大長度是多少碴裙?

255字節(jié)钢悲。

14、RabbitMQ允許發(fā)送的message最大可達多大青团?

根據AMQP協(xié)議規(guī)定譬巫,消息體的大小由64-bit的值來指定,所以你就可 以知道到底能發(fā)多大的數據了督笆。

15芦昔、什么情況下producer不主動創(chuàng)建queue是安全的?

  1. message是允許丟失的娃肿;

  2. 實現(xiàn)了針對未處理消息的republish功能(例如采用Publisher Confirm機 制)咕缎。

16、"dead letter" queue 的用途料扰?

當消息被RabbitMQ server投遞到consumer后凭豪,但consumer卻通過 Basic.Reject進行了拒絕時(同時設置requeue=false),那么該消息會被放 入“dead letter"queue 中晒杈。該 queue 可用于排查 message 被 reject 或 undeliver 的原因嫂伞。

17、什么說保證message被可靠持久化的條件是queue和exchange 具有durable屬性拯钻,同時message具有persistent屬性才行帖努?

binding關系可以表示為exchange - binding - queue。從文檔中我們知 道粪般,若要求投遞的message能夠不丟失拼余,要求message本身設置 persistent屬性,要求exchange和queue都設置durable屬性亩歹。

其實這問 題可以這么想匙监,若exchange或queue未設置durable屬性凡橱,則在其 crash之后就會無法恢復,那么即使message設置了 persistent屬性亭姥,仍 然存在message雖然能恢復但卻無處容身的問題稼钩;同理,若message本身 未設置persistent屬性致份,則message的持久化更無從談起变抽。

18、什么情況下會出現(xiàn)blackholed問題氮块?

blackholed問題是指,向exchange投遞了 message诡宗,而由于各種原因導 致該message丟失滔蝉,但發(fā)送者卻不知道∷郑可導致blackholed的情況:

  1. 向未綁定 queue 的 exchange 發(fā)送 message蝠引;

  2. exchange 以 binding_key key_A 綁定了 queue queue_A,但向該 exchange 發(fā)送 message 使用的 routing_key 去卩是 key_B蛀柴。

19螃概、如何防止出現(xiàn)blackholed問題?

沒有特別好的辦法鸽疾,只能在具體實踐中通過各種方式保證相關fabric的存 在吊洼。另外,如果在執(zhí)行Basic.Publish時設置mandatory=true制肮,則在遇到 可能出現(xiàn)blackholed情況時冒窍,服務器會通過返回Basic.Return告之當前 message無法被正確投遞(內含原因312 NO_ROUTE)豺鼻。

20综液、Consumer Cancellation Notification 機制用于什么場景?

用于保證當鏡像queue中master掛掉時儒飒,連接到slave上的consumer可 以收到自身consume被取消的通知谬莹,進而可以重新執(zhí)行consume動作從 新選出的master出獲得消息附帽。

若不采用該機制,連接到slave上的 consumer將不會感知master掛掉這個事情送悔,導致后續(xù)無法再收到新 master廣播出來的message。

另外荚藻,因為在鏡像queue模式下应狱,存在將 message進行requeue的可能,所以實現(xiàn)consumer的邏輯時需要能夠正 確處理出現(xiàn)重復message的情況除嘹。

21、Basic.Reject的用法是什么年缎?

該信令可用于consumer對收到的message進行reject单芜。若在該信令中設 置requeue=true,則當RabbitMQ server收到該拒絕信令后赁温,會將該 message重新發(fā)送到下一個處于consume狀態(tài)的consumer處(理論上仍 可能將該消息發(fā)送給當前consumer)股囊。若設置requeue=false居灯,則 RabbitMQ server在收到拒絕信令后怪嫌,將直接將該message從queue中移 除岩灭。

另外一種移除queue中message的小技巧是噪径,consumer回復Basic.Ack 但不對獲取到的message做任何處理。
而Basic.Nack是對Basic.Reject的擴展梗顺,以支持一次拒絕多條message 的能力寺谤。

22变屁、為什么不應該對所有的message都使用持久化機制摄职?

首先谷市,必然導致性能的下降击孩,因為寫磁盤比寫RAM慢的多,message的 吞吐量可能有10倍的差距。其次,message的持久化機制用在 RabbitMQ的內置cluster方案時會出現(xiàn)“坑爹”問題法绵。矛盾點在于盐茎,若 message設置了 persistent屬性探越,但 queue未設置 durable屬性,那么當 該queue的owner node出現(xiàn)異常后,在未重建該queue前东抹,發(fā)往該 queue 的 message 將被 blackholed 别渔;若 message 設置了 persistent 屬性哎媚, 同時queue也設置了 durable屬性,那么當queue的owner node異常且 無法重啟的情況下截珍,則該queue無法在其他node上重建,只能等待其 owner node重啟后事期,才能恢復該queue的使用稠鼻,而在這段時間內發(fā)送給 該queue的message將被blackholed。

所以唉匾,是否要對message進行持久化巍膘,需要綜合考慮性能需要磷支,以及可能遇到的問題。若想達到 100,000條/秒以上的消息吞吐量(單RabbitMQ服務器)咒循,則要么使用其他 的方式來確保message的可靠delivery,要么使用非常快速的存儲系統(tǒng)以 支持全持久化(例如使用SSD)。另外一種處理原則是:僅對關鍵消息作持久 化處理(根據業(yè)務重要程度),且應該保證關鍵消息的量不會導致性能瓶 頸。

23睹晒、RabbitMQ 中的 cluster锉试、mirrored queue拖云,以及 warrens 機制分 別用于解決什么問題?存在哪些問題应又?

cluster是為了解決當cluster中的任意node失效后宙项,producer和 consumer均可以通過其他node繼續(xù)工作,即提高了可用性株扛;另外可以通 過增加node數量增加cluster的消息吞吐量的目的尤筐。

cluster本身不負責 message的可靠性問題(該問題由producer通過各種機制自行解 決);cluster無法解決跨數據中心的問題(即腦裂問題)洞就。

另外叔磷,在cluster前使用HAProxy可以解決node的選擇問題,即業(yè)務無 需知道cluster中多個node的ip地址奖磁。可以利用HAProxy進行失效node 的探測繁疤,可以作負載均衡咖为。

Mirrored queue是為了解決使用cluster時所創(chuàng)建的queue的完整信息僅 存在于單一node上的問題,從另一個角度增加可用性稠腊。若想正確使用該 功能躁染,需要保證:

  1. consumer 需要支持 Consumer Cancellation Notification 機制;

  2. consumer必須能夠正確處理重復message架忌。

Warrens是為了解決cluster中message可能被blackholed的問題吞彤,即不 能接受 producer 不停 republish message 但 RabbitMQ server 無回應的情況。Warrens有兩種構成方式:

一種模型是兩臺獨立的RabbitMQ server + HAProxy,其中兩個server的 狀態(tài)分別為active和hot-standby饰恕。該模型的特點為:兩臺server之間無任 何數據共享和協(xié)議交互挠羔,兩臺server可以基于不同的RabbitMQ版本违霞。

另一種模型為兩臺共享存儲的RabbitMQ server + keepalived蚌讼,其中兩個 server 的狀態(tài)分別為 active 和 cold-standby轨帜。

該模型的特點為:兩臺server基于共享存儲可以做到完全恢復喻频,要求必須 基于完全相同的RabbitMQ版本批旺。

Warrens模型存在的問題:

對于第一種模型祭往,雖然理論上講不會丟失消息爹凹,但若在該模型上使用持久 化機制衫樊,就會出現(xiàn)這樣一種情況了罪,即若作為active的server異常后锭环,持久 化在該server上的消息將暫時無法被consume,因為此時該queue將無 法在作為hot- standby的server上被重建泊藕,所以辅辩,只能等到異常的active server恢復后,才能從其上的queue中獲取相應的message進行處理吱七。 而對于業(yè)務來說汽久,需要具有:a .感知AMQP連接斷開后重建各種fabric的能 力;b.感知active server恢復的能力踊餐;c.切換回active server的時機控制景醇,以及切回后,針對message先后順序產生的變化進行處理的能力吝岭。

對于第二種模型三痰,因為是基于共享存儲的模式,所以導致active server異 常的條件窜管,可能同樣會導致cold-standby server異常散劫;另外,在該模型下幕帆, 要求active和cold-standby的server必須具有相同的node名和UID获搏,否 則將產生訪問權限問題;最后失乾,由于該模型是冷備方案常熙,故無法保證cold standby server能在你要求的時限內成功啟動。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末碱茁,一起剝皮案震驚了整個濱河市裸卫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纽竣,老刑警劉巖墓贿,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茧泪,死亡現(xiàn)場離奇詭異,居然都是意外死亡聋袋,警方通過查閱死者的電腦和手機队伟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舱馅,“玉大人缰泡,你說我怎么就攤上這事〈停” “怎么了棘钞?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長干毅。 經常有香客問我宜猜,道長,這世上最難降的妖魔是什么硝逢? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任姨拥,我火速辦了婚禮,結果婚禮上渠鸽,老公的妹妹穿的比我還像新娘叫乌。我一直安慰自己,他們只是感情好徽缚,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布憨奸。 她就那樣靜靜地躺著,像睡著了一般凿试。 火紅的嫁衣襯著肌膚如雪排宰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天那婉,我揣著相機與錄音板甘,去河邊找鬼。 笑死详炬,一個胖子當著我的面吹牛盐类,可吹牛的內容都是我干的。 我是一名探鬼主播呛谜,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼在跳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呻率?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤呻引,失蹤者是張志新(化名)和其女友劉穎礼仗,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡元践,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年韭脊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单旁。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沪羔,死狀恐怖,靈堂內的尸體忽然破棺而出象浑,到底是詐尸還是另有隱情蔫饰,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布愉豺,位于F島的核電站篓吁,受9級特大地震影響,放射性物質發(fā)生泄漏蚪拦。R本人自食惡果不足惜杖剪,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驰贷。 院中可真熱鬧盛嘿,春花似錦、人聲如沸括袒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箱熬。三九已至类垦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間城须,已是汗流浹背蚤认。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糕伐,地道東北人砰琢。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像良瞧,于是被迫代替她去往敵國和親陪汽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355