__沒有最好的 只有適合的面試
前言
RabbitMQ是MQ中的一個優秀表明,它憑藉本身的可靠性、低延遲等特性在衆多MQ實現中佔有一席之地,也是面試中常問的MQ。markdown
如何搭建RabbitMQ高可用模式?
RabbitMQ有三種模式:單機模式、普通集羣模式、鏡像集羣模式
單機和普通集羣都不能實現高可用!
單機模式不用贅述。
普通集羣模式也不存在高可用性,該模式下雖然啓動多個RabbitMQ實例,但每一個queue仍然只會放到一個RabbitMQ實例中,若是消費者從B消費,但消費的是A的queue,那B須要從A拉取消息,若是A掛了就沒法消費了。性能
RabbitMQ鏡像集羣模式spa
鏡像模式包含一個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持久化?3d
- 建立queue的時候將其設置爲持久化,這樣就能夠保證RabbitMQ持久化queue的元數據,可是它是不會持久化queue裏的數據的。
- 發送消息的時候將消息的deliveryMode設置爲2,將消息也設置爲持久化。
RabbitMQ有哪些組件、分別有什麼做用?
- ConnectionFactory(鏈接管理器):應用程序與RabbitMQ之間創建鏈接的管理器。
- Channel(信道):消息推送使用的通道, Channel是建立在「真實」TCP上的虛擬鏈接,AMQP命令都是經過Channel發送出去的,每一個信道都會有一個惟一的ID,不管是發佈消息,訂閱隊列或者接收消息都是經過Channel完成的。
- Exchange(交換器):用於轉發消息,生產者的消息會首先進入Exchange, Exchange根據消息的RoutingKey查詢路由表(BindingKey表),把消息發送到合適的Queue中。
經常使用的Exchange有三種:code
- fanout:若是交換器收到消息,將會廣播到全部綁定的隊列上。
- direct:若是RoutingKey徹底匹配,消息就被投遞到相應的隊列。
- topic:可使來自不一樣源頭的消息可以到達同一個隊列。只要RoutingKey匹配路由表(BindingKey表)就能夠轉發, 使用topic交換器時,還可使用通配符進行匹配。
- Queue(隊列):用於存儲生產者的消息。
- RoutingKey(路由鍵):生產者的消息根據RoutingKey分配到不一樣的Queue中。
- BindingKey(綁定鍵):用於創建Exchange與Queue的鏈接(綁定關係),Exchange會創建一個綁定信息的查詢表,用於路由消息到不一樣的Queue中。
- VHost:虛擬主機,嚴格來講它不是組件只是一個概念,一個broker( RabbitMQ實例)裏能夠設置多個vhost,用做不一樣用戶的權限分離。
RabbitMQ爲何使用Channel而不直接使用TCP發送命令?
考慮到TCP建立和銷燬是很是昂貴的開銷,並且操做系統每秒能建立的TCP也是有限的,業務高峯期將建立大量的鏈接,嚴重浪費資源,並且可能會遇到系統瓶頸。
若是咱們每一個請求都使用一條TCP鏈接,既知足了性能的須要,又能確保每一個鏈接的私密性,完美👍。orm
RabbitMQ如何實現延遲消息隊列?
- 經過消息過時後進入死信交換器,再由交換器轉發到延遲消費隊列,實現延遲功能。
- 使用RabbitMQ-delayed-message-exchange插件實現延遲功能。
RabbitMQ是push模式仍是pull模式
RabbitMQ兩種模式都支持,可是主要使用的仍是push模式,經過channel.basicConsume(QUEUE_NAME, false, consumer)
完成消息的消費,push模式爲RabbitMQ主動推給消費者進行消費,主動避免了消息的積壓。
pull模式可使用channel.basicGet(QUEUE_NAME, false)
來獲取消息,主要用於批量拉取消息的時候使用。隊列
回見!