RabbitMQ作為一款熱門的消息隊列中間件,具備高效可靠的消息異步傳遞機制,主要用于不同系統間的數據交流和傳遞,在企業解決方案、金融支付、電信、電子商務、社交、即時通信、視頻、物聯網、車聯網等眾多領域都有廣泛應用。
異步通信
將業務中屬于非核心或不重要的流程部分,使用消息異步通知的方式發給目標系統,這樣主業務流程無需同步等待其他系統的處理結果,從而達到系統快速響應的目的。
如網站的用戶注冊場景,在用戶注冊成功后,還需要發送注冊郵件與注冊短信,這兩個流程使用RabbitMQ消息服務通知郵件發送系統與短信發送系統,從而提升注冊流程的響應速度。
圖1 串行發送注冊郵件與短信流程


圖2 借助消息隊列異步發送注冊郵件與短信流程


錯峰流控與流量削峰
在電子商務系統或大型網站中,上下游系統處理能力存在差異,處理能力高的上游系統的突發流量可能會對處理能力低的某些下游系統造成沖擊,需要提高系統的可用性的同時降低系統實現的復雜性。電商大促銷等流量洪流突然來襲時,可以通過隊列服務堆積緩存訂單等信息,在下游系統有能力處理消息的時候再處理,避免下游訂閱系統因突發流量崩潰。消息隊列提供億級消息堆積能力,3天的默認保留時長,消息消費系統可以錯峰進行消息處理。
另外,在商品秒殺、搶購等流量短時間內暴增場景中,為了防止后端應用被壓垮,可在前后端系統間使用RabbitMQ消息隊列傳遞請求。
圖3 消息隊列應對秒殺大流量場景


系統解耦
以電商秒殺、搶購等流量短時間內暴增場景為例,傳統做法是,用戶下單后,訂單系統發送查詢請求到庫存系統,等待庫存系統返回請求結果給訂單系統。如果庫存系統發生故障,訂單系統獲取不到數據,訂單失敗。這種情況下,訂單系統和庫存系統是兩個高耦合的子系統。
圖4 系統高耦合


引入RabbitMQ消息隊列,當用戶下單后,將消息寫入到RabbitMQ消息隊列中,然后返回用戶下單成功。
庫存系統訂閱下單的消息,消費下單消息,然后進行庫操作。即使庫存系統出現故障,也不影響用戶下單。
圖5 系統解耦


高可用
普通隊列,由于隊列以及隊列內容僅存儲在單代理上,當該代理故障后,對應的隊列不可用。
RabbitMQ引入鏡像隊列機制,鏡像隊列是開源RabbitMQ 2.6.0版本新增的一個功能,允許集群將隊列鏡像到其他代理上,當集群某一代理宕機后,隊列能自動切換到鏡像中的其他代理,保證服務的可用性。
RabbitMQ引入仲裁隊列機制,仲裁隊列是開源RabbitMQ 3.8版本新增的一個功能,提供隊列復制的能力,當集群某一代理宕機后,隊列依舊可以正常運行,保證服務的可用性。