rabbitmq 延迟队列_框架系列|中间件RabbitMQ必看17道面试题
46. RabbitMQ 的使用場(chǎng)景有哪些?
- 搶購活動(dòng),削峰填谷,防止系統(tǒng)崩塌。
- 延遲信息處理,比如 10 分鐘之后給下單未付款的用戶發(fā)送郵件提醒。
- 解耦系統(tǒng),對(duì)于新增的功能可以單獨(dú)寫模塊擴(kuò)展,比如用戶確認(rèn)評(píng)價(jià)之后,新增了給用戶返積分的功能,這個(gè)時(shí)候不用在業(yè)務(wù)代碼里添加新增積分的功能,只需要把新增積分的接口訂閱確認(rèn)評(píng)價(jià)的消息隊(duì)列即可,后面再添加任何功能只需要訂閱對(duì)應(yīng)的消息隊(duì)列即可。
- 訂單系統(tǒng):用戶下單后,訂單系統(tǒng)完成持久化處理,將消息寫入消息隊(duì)列,返回用戶訂單下單成功
- 庫存系統(tǒng):訂閱下單的消息,采用拉/推的方式,獲取下單信息,庫存系統(tǒng)根據(jù)下單信息,進(jìn)行庫存操作
- 假如:在下單時(shí)庫存系統(tǒng)不能正常使用。也不影響正常下單,因?yàn)橄聠魏?#xff0c;訂單系統(tǒng)寫入消息隊(duì)列就不再關(guān)心其他的后續(xù)操作了。實(shí)現(xiàn)訂單系統(tǒng)與庫存系統(tǒng)的應(yīng)用解耦
- 為了保證庫存肯定有,可以將隊(duì)列大小設(shè)置成庫存數(shù)量,或者采用其他方式解決。
47. 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)消息,只是扮演“快遞”的角色。
48. RabbitMQ 有哪些重要的組件?
- ConnectionFactory(連接管理器):應(yīng)用程序與Rabbit之間建立連接的管理器,程序代碼中使用。
- Channel(信道):消息推送使用的通道。
- Exchange(交換器):用于接受、分配消息。
- Queue(隊(duì)列):用于存儲(chǔ)生產(chǎn)者的消息。
- RoutingKey(路由鍵):用于把生成者的數(shù)據(jù)分配到交換器上。
- BindingKey(綁定鍵):用于把交換器的消息綁定到隊(duì)列上。
49. RabbitMQ 中 vhost 的作用是什么?
host本質(zhì)上是一個(gè)mini版的RabbitMQ服務(wù)器,擁有自己的隊(duì)列、綁定、交換器和權(quán)限控制;
vhost通過在各個(gè)實(shí)例間提供邏輯上分離,允許你為不同應(yīng)用程序安全保密地運(yùn)行數(shù)據(jù);
vhost是AMQP概念的基礎(chǔ),必須在連接時(shí)進(jìn)行指定,RabbitMQ包含了默認(rèn)vhost:“/”;
當(dāng)在RabbitMQ中創(chuàng)建一個(gè)用戶時(shí),用戶通常會(huì)被指派給至少一個(gè)vhost,并且只能訪問被指派vhost內(nèi)的隊(duì)列、交換器和綁定,vhost之間是絕對(duì)隔離的。
vhost操作:
rabbitmqctl50. RabbitMQ 的消息是怎么發(fā)送的?
首先客戶端必須連接到 RabbitMQ 服務(wù)器才能發(fā)布和消費(fèi)消息,客戶端和 rabbit server 之間會(huì)創(chuàng)建一個(gè) tcp 連接,一旦 tcp 打開并通過了認(rèn)證(認(rèn)證就是你發(fā)送給 rabbit 服務(wù)器的用戶名和密碼),你的客戶端和 RabbitMQ 就創(chuàng)建了一條 amqp 信道(channel),信道是創(chuàng)建在“真實(shí)” tcp 上的虛擬連接,amqp 命令都是通過信道發(fā)送出去的,每個(gè)信道都會(huì)有一個(gè)唯一的 id,不論是發(fā)布消息,訂閱隊(duì)列都是通過這個(gè)信道完成的。
51. RabbitMQ 怎么保證消息的穩(wěn)定性?
- 提供了事務(wù)的功能。
- 通過將 channel 設(shè)置為 confirm(確認(rèn))模式。
52. RabbitMQ 怎么避免消息丟失?
- 把消息持久化磁盤,保證服務(wù)器重啟消息不丟失。
- 每個(gè)集群中至少有一個(gè)物理磁盤,保證消息落入磁盤。
53. 要保證消息持久化成功的條件有哪些?
- 聲明隊(duì)列必須設(shè)置持久化 durable 設(shè)置為 true.
- 消息推送投遞模式必須設(shè)置持久化,deliveryMode 設(shè)置為 2(持久)。
- 消息已經(jīng)到達(dá)持久化交換器。
- 消息已經(jīng)到達(dá)持久化隊(duì)列。
以上四個(gè)條件都滿足才能保證消息持久化成功。
54. RabbitMQ 持久化有什么缺點(diǎn)?
持久化的缺地就是降低了服務(wù)器的吞吐量,因?yàn)槭褂玫氖谴疟P而非內(nèi)存存儲(chǔ),從而降低了吞吐量。可盡量使用 ssd 硬盤來緩解吞吐量的問題。
55. RabbitMQ 有幾種廣播類型?
- direct(默認(rèn)方式):最基礎(chǔ)最簡(jiǎn)單的模式,發(fā)送方把消息發(fā)送給訂閱方,如果有多個(gè)訂閱者,默認(rèn)采取輪詢的方式進(jìn)行消息發(fā)送。
- headers:與 direct 類似,只是性能很差,此類型幾乎用不到。
- fanout:分發(fā)模式,把消費(fèi)分發(fā)給所有訂閱者。
- topic:匹配訂閱模式,使用正則匹配到消息隊(duì)列,能匹配到的都能接收到。
56. RabbitMQ 怎么實(shí)現(xiàn)延遲消息隊(duì)列?
延遲隊(duì)列的實(shí)現(xiàn)有兩種方式:
- 通過消息過期后進(jìn)入死信交換器,再由交換器轉(zhuǎn)發(fā)到延遲消費(fèi)隊(duì)列,實(shí)現(xiàn)延遲功能;
- 使用 RabbitMQ-delayed-message-exchange 插件實(shí)現(xiàn)延遲功能。
57. RabbitMQ 集群有什么用?
集群主要有以下兩個(gè)用途:
- 高可用:某個(gè)服務(wù)器出現(xiàn)問題,整個(gè) RabbitMQ 還可以繼續(xù)使用;
- 高容量:集群可以承載更多的消息量。
58. RabbitMQ 節(jié)點(diǎn)的類型有哪些?
- 磁盤節(jié)點(diǎn):消息會(huì)存儲(chǔ)到磁盤。
- 內(nèi)存節(jié)點(diǎn):消息都存儲(chǔ)在內(nèi)存中,重啟服務(wù)器消息丟失,性能高于磁盤類型。
59. RabbitMQ 集群搭建需要注意哪些問題?
- 各節(jié)點(diǎn)之間使用“--link”連接,此屬性不能忽略。
- 各節(jié)點(diǎn)使用的 erlang cookie 值必須相同,此值相當(dāng)于“秘鑰”的功能,用于各節(jié)點(diǎn)的認(rèn)證。
- 整個(gè)集群中必須包含一個(gè)磁盤節(jié)點(diǎn)。
60. RabbitMQ 每個(gè)節(jié)點(diǎn)是其他節(jié)點(diǎn)的完整拷貝嗎?為什么?
不是,原因有以下兩個(gè):
- 存儲(chǔ)空間的考慮:如果每個(gè)節(jié)點(diǎn)都擁有所有隊(duì)列的完全拷貝,這樣新增節(jié)點(diǎn)不但沒有新增存儲(chǔ)空間,反而增加了更多的冗余數(shù)據(jù);
- 性能的考慮:如果每條消息都需要完整拷貝到每一個(gè)集群節(jié)點(diǎn),那新增節(jié)點(diǎn)并沒有提升處理消息的能力,最多是保持和單節(jié)點(diǎn)相同的性能甚至是更糟。
61. RabbitMQ 集群中唯一一個(gè)磁盤節(jié)點(diǎn)崩潰了會(huì)發(fā)生什么情況?
如果唯一磁盤的磁盤節(jié)點(diǎn)崩潰了,不能進(jìn)行以下操作:
- 不能創(chuàng)建隊(duì)列
- 不能創(chuàng)建交換器
- 不能創(chuàng)建綁定
- 不能添加用戶
- 不能更改權(quán)限
- 不能添加和刪除集群節(jié)點(diǎn)
唯一磁盤節(jié)點(diǎn)崩潰了,集群是可以保持運(yùn)行的,但你不能更改任何東西。
62. RabbitMQ 對(duì)集群節(jié)點(diǎn)停止順序有要求嗎?
RabbitMQ 對(duì)集群的停止的順序是有要求的,應(yīng)該先關(guān)閉內(nèi)存節(jié)點(diǎn),最后再關(guān)閉磁盤節(jié)點(diǎn)。如果順序恰好相反的話,可能會(huì)造成消息的丟失。
總結(jié)
以上是生活随笔為你收集整理的rabbitmq 延迟队列_框架系列|中间件RabbitMQ必看17道面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BOOT.INI文件的目的[微软提供]
- 下一篇: 深入浅出PE文件格式---自己动手打造P