135.rabbitmq 的使用場景有哪些?
①. 跨系統的異步通信,所有需要異步交互的地方都可以使用消息隊列。就像我們除了打電話(同步)以外,還需要發短信,發電子郵件(異步)的通訊方式。
②. 多個應用之間的耦合,由于消息是平臺無關和語言無關的,而且語義上也不再是函數調用,因此更適合作為多個應用之間的松耦合的接口。基于消息隊列的耦合,不需要發送方和接收方同時在線。在企業應用集成(EAI)中,文件傳輸,共享數據庫,消息隊列,遠程過程調用都可以作為集成的方法。
③. 應用內的同步變異步,比如訂單處理,就可以由前端應用將訂單信息放到隊列,后端應用從隊列里依次獲得消息處理,高峰時的大量訂單可以積壓在隊列里慢慢處理掉。由于同步通常意味著阻塞,而大量線程的阻塞會降低計算機的性能。
④. 消息驅動的架構(EDA),系統分解為消息隊列,和消息制造者和消息消費者,一個處理流程可以根據需要拆成多個階段(Stage),階段之間用隊列連接起來,前一個階段處理的結果放入隊列,后一個階段從隊列中獲取消息繼續處理。
⑤. 應用需要更靈活的耦合方式,如發布訂閱,比如可以指定路由規則。
⑥. 跨局域網,甚至跨城市的通訊(CDN行業),比如北京機房與廣州機房的應用程序的通信。
136.rabbitmq 有哪些重要的角色?
RabbitMQ 中重要的角色有:生產者、消費者和代理:
- 生產者:消息的創建者,負責創建和推送數據到消息服務器;
- 消費者:消息的接收方,用于處理數據和確認消息;
- 代理:就是 RabbitMQ 本身,用于扮演“快遞”的角色,本身不生產消息,只是扮演“快遞”的角色。
137.rabbitmq 有哪些重要的組件?
- ConnectionFactory(連接管理器):應用程序與Rabbit之間建立連接的管理器,程序代碼中使用。
- Channel(信道):消息推送使用的通道。
- Exchange(交換器):用于接受、分配消息。
- Queue(隊列):用于存儲生產者的消息。
- RoutingKey(路由鍵):用于把生成者的數據分配到交換器上。
- BindingKey(綁定鍵):用于把交換器的消息綁定到隊列上。
138.rabbitmq 中 vhost 的作用是什么?
vhost 可以理解為虛擬 broker ,即 mini-RabbitMQ server。其內部均含有獨立的 queue、exchange 和 binding 等,但最最重要的是,其擁有獨立的權限系統,可以做到 vhost 范圍的用戶控制。當然,從 RabbitMQ 的全局角度,vhost 可以作為不同權限隔離的手段(一個典型的例子就是不同的應用可以跑在不同的 vhost 中)。
139.rabbitmq 的消息是怎么發送的?
首先客戶端必須連接到 RabbitMQ 服務器才能發布和消費消息,客戶端和 rabbit server 之間會創建一個 tcp 連接,一旦 tcp 打開并通過了認證(認證就是你發送給 rabbit 服務器的用戶名和密碼),你的客戶端和 RabbitMQ 就創建了一條 amqp 信道(channel),信道是創建在“真實” tcp 上的虛擬連接,amqp 命令都是通過信道發送出去的,每個信道都會有一個唯一的 id,不論是發布消息,訂閱隊列都是通過這個信道完成的。
140.rabbitmq 怎么保證消息的穩定性?
提供了事務的功能。
通過將 channel 設置為 confirm(確認)模式。
141.rabbitmq 怎么避免消息丟失?
- 消息持久化
- ACK確認機制
- 設置集群鏡像模式
- 消息補償機制
142.要保證消息持久化成功的條件有哪些?
- 聲明隊列必須設置持久化 durable 設置為 true.
- 消息推送投遞模式必須設置持久化,deliveryMode 設置為 2(持久)。
- 消息已經到達持久化交換器。
- 消息已經到達持久化隊列。
以上四個條件都滿足才能保證消息持久化成功。
143.rabbitmq 持久化有什么缺點?
持久化的缺地就是降低了服務器的吞吐量,因為使用的是磁盤而非內存存儲,從而降低了吞吐量。可盡量使用 ssd 硬盤來緩解吞吐量的問題。
144.rabbitmq 有幾種廣播類型?
三種廣播模式:
- fanout: 所有bind到此exchange的queue都可以接收消息(純廣播,綁定到RabbitMQ的接受者都能收到消息);
- direct: 通過routingKey和exchange決定的那個唯一的queue可以接收消息;
- topic:所有符合routingKey(此時可以是一個表達式)的routingKey所bind的queue可以接收消息;
145.rabbitmq 怎么實現延遲消息隊列?
通過消息過期后進入死信交換器,再由交換器轉發到延遲消費隊列,實現延遲功能;
使用 RabbitMQ-delayed-message-exchange 插件實現延遲功能。
146.rabbitmq 集群有什么用?
集群主要有以下兩個用途:
- 高可用:某個服務器出現問題,整個 RabbitMQ 還可以繼續使用;
- 高容量:集群可以承載更多的消息量。
147.rabbitmq 節點的類型有哪些?
- 磁盤節點:消息會存儲到磁盤。
- 內存節點:消息都存儲在內存中,重啟服務器消息丟失,性能高于磁盤類型。
148.rabbitmq 集群搭建需要注意哪些問題?
各節點之間使用“–link”連接,此屬性不能忽略。
各節點使用的 erlang cookie 值必須相同,此值相當于“秘鑰”的功能,用于各節點的認證。
整個集群中必須包含一個磁盤節點。
149.rabbitmq 每個節點是其他節點的完整拷貝嗎?為什么?
不是,原因有以下兩個:
- 存儲空間的考慮:如果每個節點都擁有所有隊列的完全拷貝,這樣新增節點不但沒有新增存儲空間,反而增加了更多的冗余數據;
- 性能的考慮:如果每條消息都需要完整拷貝到每一個集群節點,那新增節點并沒有提升處理消息的能力,最多是保持和單節點相同的性能甚至是更糟。
150.rabbitmq 集群中唯一一個磁盤節點崩潰了會發生什么情況?
如果唯一磁盤的磁盤節點崩潰了,不能進行以下操作:
- 不能創建隊列
- 不能創建交換器
- 不能創建綁定
- 不能添加用戶
- 不能更改權限
- 不能添加和刪除集群節點
唯一磁盤節點崩潰了,集群是可以保持運行的,但你不能更改任何東西。
151.rabbitmq 對集群節點停止順序有要求嗎?
RabbitMQ 對集群的停止的順序是有要求的,應該先關閉內存節點,最后再關閉磁盤節點。如果順序恰好相反的話,可能會造成消息的丟失。