什麼是MQ

MQ就是Message Queue的縮寫,本質上就是一個隊列只不過隊列裏存放的元素是一些消息而已,消息的類型可以很簡單比如一個數字或者一個字符串,也行是一些內嵌對象等等。

MQ一般用於分佈式系統之間的通信

  • 同步通信

數據直接由一端到達另一端

  • 異步通信

數據由一端發送到一個容器存儲起來,之後達到某個條件後再由這個容器發送給另外另一端。MQ就是這個容器的一個具體實現,而rabbitmq則是MQ的一種完成。

RabbitMq要點講解 -_數據

MQ的作用

MQ實際上就是起到一個倉庫的作用。

  1. 異步解耦:在業務流程中,⼀些操作可能⾮常耗時,但並不需要即時返回結果.可以藉助MQ把這些操 作異步化,比如用户註冊後發送註冊短信或郵件通知,可以作為異步任務處理,而不必等待這些操作 完成後才告知用户註冊成功.
  2. 通過流量削峯:在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見.如果 以能處理這類峯值為標準而投入資源,無疑是巨大的浪費.使⽤MQ能夠使關鍵組件支撐突發訪問壓力,不會由於突發流量而崩潰.比如秒殺或者促銷活動,能夠使⽤MQ來控制流量,將請求排隊,然後系 統根據自己的處理能力逐步處理這些請求.
  3. 通過消息分發:當多個系統需要對同⼀數據做出響應時,可以運用MQ進行消息分發.比如支付成功後,支付系統能夠向MQ發送消息,其他系統訂閲該消息,而無需輪詢數據庫.
  4. 延遲通知:在需要在特定時間後發送通知的場景中,允許利用MQ的延遲消息作用比如在電⼦商務平 台中,如果用户下單後⼀定時間內未支付,能夠使用延遲隊列在超時後自動取消訂單

其他MQ

比較流行的MQ包括RabbitMQ,RocketMQ,Kafka等

Kafka

首選kafka了。就是Kafka一開始的目的就是用於日誌收集和傳輸,追求高吞吐量,性能卓越,單機吞吐達到十萬級,在日誌領域比較成熟,功能較為簡單,主要支持簡單的MQ功能,如果有日誌採集需求,肯定

RocketMQ

RocketMQ採用Java語言開發,由阿里巴巴開源,後捐贈給了Apache。它在設計時借鑑了Kafka,並做出了一些自己的改進,青出於藍而勝於藍,經過多年雙十一的洗禮,在可用性、可靠性以及穩定性等方面都有出色的表現。適合對於可靠性比較高,且併發比較大的場景,比如互聯網金融。但幫助的客户端語言不多,且社區活躍度一般。

RabbitMQ

採用Erlang語言構建,MQ功能比較完備,且幾乎承受所有主流語言,開源提供的界面也非常友好,性能較好,吞吐量能達到萬級,社區活躍度也比較高,比較適合中小型公司,數據量沒那麼大,且併發沒那麼高的場景。

RabbitMQ核心概念

Producer:生產者,也是RabbitMQ Service的客户端,向RabbitMQ發送信息

Consumer:消費者,也是一個RabbitMQ Service的客户端,從RabbitMQ接受消息

Broker:就是RabbitMQ Service,用來接受生產者的消息,然後發送給消費者

RabbitMq要點講解 -_數據_02

Connection:鏈接,就是生產者或消費者(客户端),和RabbitMQ之間的一個TCP連接,負責傳輸客户端和服務器之間所有的數據和消息

Channel:將消息的讀寫操作複用到一個TCP連接上,這樣就允許減少建立和關閉連接的開銷,提高性能。就是通道,Channel是建立在Connection之上,又或者説是包括在Connection裏,一個TCP連接可以含有多個Channel,每個Channel都是獨立的,發送和接受消息都是基於Channel,換言之由Channel來進行發送和接受消息。Channel的關鍵作用就

Virtualhost:虛擬主機。這是一個虛擬的概念,為消息隊列提供了一個邏輯上的隔離,一個Broker可以有多個虛擬機,當有多個用户使用同一個RabbitMQ服務時,可以虛擬出多個vhost,每個用户在自己的vhost創建隊列等,就好比是MySQL的database

Queue:隊列,用來存儲消息,多個消費者可以訂閲同一個隊列

Exchange:交換機,生產者發送一條消息,通過Channel,然後到達交換機,之後再由交換機,根據一定規則分發給各個Queue中,最後消費者會從訂閲的Queue中接受資料,交換機主要就起到一個路由的作用,用於分發消息,就類似將快遞分發到各個站點。

RabbitMQ工作流程

RabbitMq要點講解 -_數據_03

  1. 首先由Producer產生一條消息
  2. 然後Producer和Broker建立一個連接Connection,並開啓一條信道Channel
  3. 接着消息由交換機進行路由,進過一些條件發送到對應Queue,並存放信息
  4. 最後Consumer也通過Channel獲取到訂閲的隊列裏的消息並處理

AMQP

AMQP(Advanced Message Queuing Protocol)是一種高級消息隊列協議,AMQP定義了一套確定的消息交換功能,包括交換器(Exchange)、隊列(Queue)等。這些組件共同工作,使得生產者能夠將消息發送到交換器,然後由隊列接收並等待消費者接收。AMQP還定義了一個網絡協議,允許客户端應用經過該協議與消息代理和AMQP模型進行交互通信。RabbitMQ是遵從AMQP協議的,換句話説,RabbitMQ就是AMQP協議的Erlang的實現(當然RabbitMQ還協助STOMP、MQTT等協議)。AMQP的模型結構和RabbitMQ的模型結構是一樣的。