引入
首先先介紹一下什么是 RabbitMQ 的意思:Rabbit 是一個公司的名稱,MQ 是 message queue (消息隊列)的縮寫,而 RabbitMQ 是 Rabbit 企業下的一個消息隊列產品,是一個采用Erlang語言實現AMQP(Advanced Message Queuing Protocol,高級消息隊列協議)的消息中間件,它最初起源于金融系統領域,為了在分布式系統中存儲和轉發消息而設計的.,是當前主流的消息中間件之一。在互聯網架構中,會經常使用 MQ 來作為消息消息通信服務。
AMQP,是高級消息隊列協議(Advanced Message Queuing Protocol)的意思,是一個通用的應用層協議,提供統一的消息服務協議,為面向消息的中間件設計。基于此協議的客戶端與消息中間件可以傳遞消息,并不受客戶端或者中間件,開發語言等條件的限制。
Message Queue
消息隊列可以把它理解為數據結構中的“隊列”,有先進先出的性質(FIFO),隊列中存放的內容是消息(Message)。并且消息的的內容或格式也可以多種多樣:JSON 數據,文本字符串等。
MQ 多用于分布式系統之間的通訊,而系統之間的調用常有兩種方式:
- 同步通訊:(下圖右側為“服務2”)直接調用對方的服務,數據從一端出發后立可以到達另一段
- 異步通訊:數據從一段發出后,先進入一個容器(消息隊列)進行臨時存儲,當達到某種條件的時候,這個容器再發送給另一端,而這個容器的具體實現就是 message queue(MQ)
作用
從上圖上可以看出,MQ 在整個系統調用過程中充當了一個類似于中介的作用,也就是接受和轉發消息,常見解決的問題的場景有一下幾種:
- 異步解耦:有時候調用一些接口返回數據的時候,可能在查詢數據庫的時候話費了很長的時間才可以把數據返回,但是這樣給用戶的體驗就很差,所以可以優化一下,就是不即使的返回結果,借助 MQ 把這些操作異步優化,比如用戶注冊后發送注冊短信或者郵件通知,可以作為異步任務處理,從而不必等待這些操作完成后才告知用戶注冊成功;
- 流量削峰:如果某一時刻某個接口的 QPS 或者訪問量激增的情況下,我們的服務器就可能會崩潰掉,但是我們如果因為這種并不是很常見的情況下投入成本去增加數量或者提升服務器處理能力的話是比較浪費資源的,因此我們可以使用 MQ 的關鍵組件來支撐突發訪問量,可以通過其來控制流量,將請求排隊,然后系統根據自己的處理能力逐步處理這些請求