RabbitMq常见问题
RabbitMq常見問題
目錄
什么是RabbitMQ?
為什么要使用RabbitMQ?
消息隊列的優缺點?
rabbitmq 的使用場景有哪些?
rabbitmq 有哪些重要的角色?
rabbitmq 有哪些重要的組件?
rabbitmq 中 vhost 的作用是什么?
rabbitmq 的消息是怎么發送的?
rabbitmq 怎么保證消息的穩定性?
rabbitmq 怎么避免消息丟失?
要保證消息持久化成功的條件有哪些?
rabbitmq 持久化有什么缺點?
rabbitmq 有幾種廣播類型?
rabbitmq 怎么實現延遲消息隊列?
rabbitmq 集群有什么用?
rabbitmq 節點的類型有哪些?
rabbitmq 集群搭建需要注意哪些問題?
rabbitmq 每個節點是其他節點的完整拷貝嗎?為什么?
rabbitmq 集群中唯一一個磁盤節點崩潰了會發生什么情況?
rabbitmq 對集群節點停止順序有要求嗎?
Kafka 與 RabbitMQ 的區別?
1. 什么是RabbitMQ?
RabbitMQ 即一個消息隊列,主要是用來實現應用程序的異步和解耦,同時也能起到消息緩沖,消息分發的作用。RabbitMQ使用的是AMQP協議,它是一種二進制協議。
AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。基于此協議的客戶端與消息中間件可傳遞消息,并不受客戶端/中間件不同產品,不同的開發語言等條件的限制。Erlang中的實現有 RabbitMQ等。
2. 為什么要使用RabbitMQ?
要結合具體應用場景去分析,知道不同消息隊列的區別。
具體文章見:Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么優缺點:https://blog.csdn.net/weixin_41910694/article/details/97375307
3. 消息隊列的優缺點?
還是參考下面文章。
具體文章見:Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么優缺點:https://blog.csdn.net/weixin_41910694/article/details/97375307
4. rabbitmq 的使用場景有哪些?
- 搶購活動,削峰填谷,防止系統崩潰。
- 延遲信息處理,比如10分鐘之后給下單未付款的用戶發送郵件提醒。
- 解耦系統,對于新增的功能可以單獨寫模塊擴展,比如用戶確認評價之后,新增了給用戶返積分的功能,這個時候不用在業務代碼里添加新增積分的功能,只需要把新增積分的接口訂閱確認評價的消息隊列即可,后面再添加任何功能只需要訂閱對應的消息隊列即可。
5. rabbitmq 有哪些重要的角色?
RabbitMq 中重要的角色有:生產者,消費者和代理
- 生產者:消費的創建者,負責創建和推送數據到消息服務器;
- 消費者:消息的接收方,用于處理數據和確認消息;
- 代理:就是 RabbitMq 本身,用于扮演“快遞”的角色,本身不生成消息,只是扮演“快遞”的角色。
6. rabbitmq 有哪些重要的組件?
- ConnectionFactory(連接管理器):應用程序與Rabbit之間建立連接的管理器,程序代碼中使用。
- Channel(信道):消息推送使用的通道。
- Exchange(交換器):用于接受,分配消息。
- Queue(隊列):用于存儲生產者的消息。
- RoutingKey(路由鍵):用于把生產者的數據分配到交換器上。
- BindingKey(綁定鍵):用于把交換器的消息綁定到隊列上。
7. rabbitmq 中 vhost 的作用是什么?
vhost:每個RabbitMq都能創建多個vhost,我們稱之為虛擬主機,每個虛擬主機其實都是mini版的RabbitMq,它擁有自己的隊列,交換器和綁定,擁有自己的權限機制。
8. rabbitmq 的消息是怎么發送的?
首先客戶端必須連接到RabbitMq服務器才能發布和消費消息,客戶端和 rabbit server 之間會創建一個tcp連接,一旦tcp打開并通過了認證(認證就是你發送給rabbit服務器的用戶名和密碼),你的客戶端和 RabbitMq 就創建一條 amqp 信道(channel),信道是創建在“真實”tcp上的虛擬連接,amqp命令都是通過信道發送出去的,每個信道都會有唯一的id,不論是發布消息,訂閱隊列都是通過這個信道完成的。
9. rabbitmq 怎么保證消息的穩定性?
- 提供了事務的功能。
- 通過將channel設置為confirm(確認)模式。
10. rabbitmq 怎么避免消息丟失?
- 把消息持久化磁盤,保證服務器重啟消息不丟失。
- 每個集群至少有一個物理磁盤,保證消息落入磁盤。
11. 要保證消息持久化成功的條件有哪些?
- 聲明隊列必須設置持久化 durable 設置為 true。
- 消息推送投遞模式必須設置持久化, deliveryMode設置為2(持久)。
- 消息已經到達持久化交換器
- 消息已經到達持久化隊列。
12. rabbitmq 持久化有什么缺點?
持久化的缺點就是降低了服務器的吞吐量,因為使用的是磁盤而非內存存儲,從而降低了吞吐量。可盡量使用ssd硬盤來緩解吞吐量的問題。
13. rabbitmq 有幾種廣播類型?
- direct(默認方式):最基礎最簡單的模式,發送方把消息發送給訂閱方,如果有多個訂閱者,默認采用輪詢的方式進行消息發送。
- headers:與direct類似,只是性能很差,次類型幾乎用不到。
- fanout:分發模式,把消費分發給所有訂閱者。
- topic:匹配訂閱模式,使用正則匹配到消息隊列,能匹配到的都能接收到。
14. rabbitmq 怎么實現延遲消息隊列?
延遲隊列的實現有兩種方式:
- 通過消息過期后進入死信交換器,再由交換器轉發到延遲消費隊列,實現延遲功能。
- 使用 RabbitMq-delayed-message-exchange 插件實現延遲功能。
15. rabbitmq 集群有什么用?
集群主要有以下兩個用途:
- 高可用:某個服務器出現問題,整個RabbitMq還可以繼續使用。
- 高容量:集群可以承載更多的消息量。
16. rabbitmq 節點的類型有哪些?
- 磁盤節點:消息會存儲到磁盤。
- 內存節點:消息都存儲到內存中,重啟服務器消息丟失,性能高于磁盤類型。
17. rabbitmq 集群搭建需要注意哪些問題?
- 各節點之間使用“-link”連接,此屬性不能忽略。
- 各節點使用的 erlang cookie 值必須相同,此值相當于“秘鑰”的功能,用于各節點的認證。
- 整個集群必須包含一個磁盤節點。
18. rabbitmq 每個節點是其他節點的完整拷貝嗎?為什么?
不是,原因有以下兩個:
- 存儲空間的考慮:如果每個節點都擁有所有隊列的完全拷貝,這樣新增節點不但沒有新增存儲空間,反而增加了更多的冗余數據。
- 性能的考慮:如果每條消息都需要完整拷貝每一個集群節點,那新增節點并沒有提升處理消息的能力,最多是保持和單節點相同的性能甚至更糟。
19. rabbitmq 集群中唯一一個磁盤節點崩潰了會發生什么情況?
如果唯一磁盤的磁盤節點崩潰,不能進行一下操作:
- 不能創建隊列
- 不能創建交換器
- 不能創建綁定
- 不能添加用戶
- 不能更改權限
- 不能添加和刪除集群節點
唯一磁盤節點崩潰了,集群是可以保持運行的,但你不能更改任何東西。
20. rabbitmq 對集群節點停止順序有要求嗎?
RabbitMq 對集群的停止的順序是有要求的,應該先關閉內存節點,最后關閉磁盤節點。如果順序恰好相反的話,可能造成消息的丟失。
21. rabbitmq 和 kafka的區別?
RabbitMQ:用于實時的,對可靠性要求較高的消息傳遞上。
kafka:用于處于活躍的流式數據,大數據量的數據處理上。
producer,broker,consumer
RabbitMQ:以broker為中心,有消息的確認機制
kafka:以consumer為中心,無消息的確認機制
RabbitMQ:支持消息的可靠的傳遞,支持事務,不支持批量操作,基于存儲的可靠性的要求存儲可以采用內存或硬盤,吞吐量小。
kafka:內部采用消息的批量處理,數據的存儲和獲取是本地磁盤順序批量操作,消息處理的效率高,吞吐量高。
RabbitMQ:本身不支持負載均衡,需要loadbalancer的支持
kafka:采用zookeeper對集群中的broker,consumer進行管理,可以注冊topic到zookeeper上,通過zookeeper的協調機制,producer保存對應的topic的broker信息,可以隨機或者輪詢發送到broker上,producer可以基于語義指定分片,消息發送到broker的某個分片上。
kafka通過zk和分區機制實現:zk記錄broker信息,生產者可以獲取到并通過策略完成負載均衡;通過分區,投遞消息到不同分區,消費者通過服務組完成均衡消費。
消息中間件選型分析——從Kafka與RabbitMQ的對比來看全局:https://blog.csdn.net/u013256816/article/details/79838428
總結
以上是生活随笔為你收集整理的RabbitMq常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zookeeper常见问题总结
- 下一篇: JVM常见问题总结