剛從某大廠面試回來,給大家一篇完整的RabbitMQ面試指南

__沒有最好的 只有適合的

前言

RabbitMQ是MQ中的一個優秀代表,它憑藉自己的可靠性、低延遲等特性在眾多MQ實現中佔有一席之地,也是面試中常問的MQ。

如何搭建RabbitMQ高可用模式?

RabbitMQ有三種模式:單機模式、普通集群模式、鏡像集群模式 單機和普通集群都不能實現高可用! 單機模式不用贅述。 普通集群模式也不存在高可用性,該模式下雖然啟動多個RabbitMQ實例,但每個queue仍然只會放到一個RabbitMQ實例中,如果消費者從B消費,但消費的是A的queue,那B需要從A拉取消息,如果A掛了就無法消費了。

RabbitMQ鏡像集群模式

鏡像模式包含一個master和多個slave,分佈在不同的節點上。除了publish外所有動作都只會向master發送,master將命令執行的結果廣播給slave,slave會準確地按照master執行命令的順序進行執行,所以隊列的消費操作都是在master上完成的,但消息都同步保存在所有節點上。 如果master掛了,生產者發送的消息還保存在其他的slave上,此時將一個slave提升為master就又可以消費消息了!

RabbitMQ如何保證不丟數據?

上篇文章講了從三個方面來防範丟失數據:生產端、隊列本身、消費端

  • 生產端:開啟事務(不推薦,太耗性能降低吞吐),推薦開啟confirm模式,在生產者那裡設置開啟confirm模式之後,你每次寫的消息都會分配一個唯一的id,寫入了RabbitMQ後,RabbitMQ會給你回傳一個ack消息,說明消息發送成功了。如果RabbitMQ沒能處理這個消息,會返回一個nack消息,告訴你這個消息接收失敗。
  • 隊列本身:開啟RabbitMQ的持久化,消息寫入之後會持久化到磁盤,就算機器掛了,也能恢復。
  • 消費端:通過手動comfirm機制確認消息已經被正確消費了。

怎麼設置RabbitMQ持久化?

創建queue的時候將其設置為持久化,這樣就可以保證RabbitMQ持久化queue的元數據,但是它是不會持久化queue裡的數據的。 發送消息的時候將消息的deliveryMode設置為2,將消息也設置為持久化。

RabbitMQ有哪些組件、分別有什麼作用?

  • ConnectionFactory(連接管理器):應用程序與RabbitMQ之間建立連接的管理器。
  • Channel(信道):消息推送使用的通道, Channel是創建在“真實”TCP上的虛擬連接,AMQP命令都是通過Channel發送出去的,每個信道都會有一個唯一的ID,不論是發佈消息,訂閱隊列或者接收消息都是通過Channel完成的。
  • Exchange(交換器):用於轉發消息,生產者的消息會首先進入Exchange, Exchange根據消息的RoutingKey查詢路由表(BindingKey表),把消息發送到合適的Queue中。

常用的Exchange有三種:

fanout:如果交換器收到消息,將會廣播到所有綁定的隊列上。

剛從某大廠面試回來,給大家一篇完整的RabbitMQ面試指南

direct:如果RoutingKey完全匹配,消息就被投遞到相應的隊列。

剛從某大廠面試回來,給大家一篇完整的RabbitMQ面試指南

topic:可以使來自不同源頭的消息能夠到達同一個隊列。只要RoutingKey匹配路由表(BindingKey表)就可以轉發, 使用topic交換器時,還可以使用通配符進行匹配。

剛從某大廠面試回來,給大家一篇完整的RabbitMQ面試指南

  • Queue(隊列):用於存儲生產者的消息。
  • RoutingKey(路由鍵):生產者的消息根據RoutingKey分配到不同的Queue中。
  • BindingKey(綁定鍵):用於建立Exchange與Queue的連接(綁定關係),Exchange會建立一個綁定信息的查詢表,用於路由消息到不同的Queue中。
  • VHost:虛擬主機,嚴格來說它不是組件只是一個概念,一個broker( RabbitMQ實例)裡可以設置多個vhost,用作不同用戶的權限分離。

RabbitMQ為什麼使用Channel而不直接使用TCP發送命令?

考慮到TCP創建和銷燬是非常昂貴的開銷,而且操作系統每秒能創建的TCP也是有限的,業務高峰期將創建大量的連接,嚴重浪費資源,而且可能會遇到系統瓶頸。 如果我們每個請求都使用一條TCP連接,既滿足了性能的需要,又能確保每個連接的私密性,完美。

RabbitMQ如何實現延遲消息隊列?

  1. 通過消息過期後進入死信交換器,再由交換器轉發到延遲消費隊列,實現延遲功能。
  2. 使用RabbitMQ-delayed-message-exchange插件實現延遲功能。

RabbitMQ是push模式還是pull模式

RabbitMQ兩種模式都支持,但是主要使用的還是push模式,通過channel.basicConsume(QUEUE_NAME, false, consumer)完成消息的消費,push模式為RabbitMQ主動推給消費者進行消費,主動避免了消息的積壓。 pull模式可以使用channel.basicGet(QUEUE_NAME, false)來獲取消息,主要用於批量拉取消息的時候使用。

回見!


作者:張偉是混蛋12138
鏈接:https://juejin.im/post/5e5fa26e51882549652d5a2e


分享到:


相關文章: