MQ 作用與介紹
MQ 是什么
MQ (message queue),從字面意思看是一個隊列, FIFO 先進先出,只不過里面存放的內容是 消息?
消息 可以比較簡單,比如只包含 文本字符串,JSON 等;也可以很復雜,比如 內嵌對象 等
MQ 多用于分布式系統之間進行通信
系統之間的調用通常有兩種方式:
1.同步通信
直接調用對方的服務,數據從一端發出后立即就可以到達另一端
2.異步通信
數據從一端發出后,先進入一個容器進行臨時存儲,當達成某個條件時,再由這個容器發送給另一端.
容器的一個具體實現就是 MQ (message queue)
MQ 作用
MQ 主要工作是接收并轉發消息
1.異步解耦
在業務流程中, 一些操作可能非常耗時, 但并不需要即時返回結果. 可以借助MQ把這些操作異步化, 比如用戶注冊后發送注冊短信或郵件通知, 可以作為異步任務處理, 而不必等待這些操作完成后才告知用戶注冊成功
2.流量削峰
在訪問量劇增的情況下, 應用仍然需要繼續發揮作用 但是這樣的突發流量并不常見. 如果以能處理這類峰值為標準而投?資源,無疑是巨大的浪費. 使用MQ能夠使關鍵組件支撐突發訪問壓力, 不會因為突發流量而崩潰. 比如秒殺或者促銷活動, 可以使用MQ來控制流量, 將請求排隊, 然后系統根據自己的處理能力逐步處理這些請求
3.消息分發
當多個系統需要對同?數據做出響應時, 可以使用MQ進行消息分發. 比如支付成功后, 支付系統可以向MQ發送消息, 其他系統訂閱該消息, 而無需輪詢數據庫
4.延遲通知
在需要在特定時間后發送通知的場景中, 可以使用MQ的延遲消息功能, 比如在電子商務平臺中,如果用戶下單后?定時間內未支付,可以使用延遲隊列在超時后自動取消訂單
..
MQ 選擇
目前有很多的MQ產品, 例如RabbitMQ, RocketMQ, ActiveMQ, Kafka, ZeroMQ等, 也有直接使用Redis充當消息隊列的案例, 這些消息隊列, 各有側重
1.Kafka
Kafka?開始的目的就是用于日志收集和傳輸,追求高吞吐量, 性能卓越, 單機吞吐達到十萬級, 在日志領域比較成熟, 功能較為簡單,主要支持簡單的 MQ 功能
2.RocketMQ
在設計時借鑒了Kafka,并做出了?些自己的改進, 可用性、可靠性以及穩定性等方面都有出色的表現. 適合對于可靠性比較高,且并發比較大的場景. 但支持的客戶端端語言不多, 且社區活躍度一般
3.RabbitMQ
采用Erlang語言開發, MQ 功能比較完備, 且幾乎支持所有主流語言,開源提供的界面也非常友好, 性能較好, 吞吐量能達到萬級, 社區活躍度也比較高
RabbitMQ 介紹
RabbitMQ 實現了 AMQP 的 消息隊列 服務
AMQP? Advanced Message Queuing Protocol (高級消息隊列協議)
是一個通用的應用層協議,提供統一消息服務的協議,為面向消息的中間件設計
基于此協議的客戶端與消息中間件可傳遞消息,并不受客戶端或中間件,開發語言等條件的限制
RabbitMQ 安裝
RabbitMQ已經包含在標準的Ubuntu倉庫中, 然而包含的版本通常比最新的RabbitMQ發行版落后很多,可能提供的RabbitMQ版本已經不支持. RabbitMQ團隊制作了自己的軟件包,并使用Cloudsmith進行分發
具體操作可參考 :?RabbitMQ
由于上述方法過于復雜,所以此處 使用 Ubuntu 倉庫中的版本來安裝
1.安裝 Erlang
RabbitMQ 需要 Erlang 語言的支持,在安裝 RabbitMQ 之前需要先安裝 Erlang
#更新軟件包
sudo apt-get update
#安裝 Erlang
sudo apt-get install erlang
#查看 Eralng 版本
sudo apt-get install erlang
#退出命令
halt().??
2.安裝 RabbitMQ
#更新軟件包
sudo apt-get update
#安裝 RabbitMQ
sudo apt-get install rabbitmq-server
#安裝結果確認
systemctl status rabbitmq-server
(此處出現 active 即為成功)
3.安裝 RabbitMQ 管理界面
#默認是不安裝管理界面的
rabbitmq-plugins enable rabbitmq_management
4.啟動服務并訪問
1. 啟動服務
#啟動 RabbitMQ
sudo service rabbitmq-server start
2. 通過 IP : port 訪問管理界面
http://云服務器IP:15672
15672 為默認端口號,云服務器需要開啟端口
默認用戶名和密碼都是 guest
RabbitMQ 從 3.3.0 開始禁止使用 guest/guest 權限通過除 localhost 外的訪問
此處需要添加新的管理員用戶
3. 添加管理員用戶
#添加用戶 admin,密碼 admin
rabbitmqctl add_user admin admin
#給用戶添加權限
rabbitmqctl set_user_tag admin administrator
#通過 IP : port 訪問,使用剛才設置的用戶名和密碼登錄
瀏覽器? ? http://云服務器IP:15672
管理員界面如下圖所示: