消息隊列概述
不管是現在還是之前,你肯定有過排隊買票的經歷。在售票窗口兩邊豎起圍擋,中間留有一人寬的空隙,每個人只能從這個圍擋形成的通道到達售票窗口,起到強制排隊的效果。試想如果沒有這個圍擋,在高峯期一羣人蜂擁到窗口是什麼效果?說不定把窗口擠爆了,最後你爭我搶都買不着票。
互聯中的很多技術都是對現實世界的抽象,爲了應對類似集中訪問服務器的場景(比如商品秒殺、搶紅包等),使用了消息隊列機制。將這些洪水般的請求放到一個隊列中,服務器中的“消費者”不慌不忙地從隊列中一個一個取出消息進行處理,起到消峯的作用。
消息隊列的作用
- 消峯
不需要將每一次請求都進行全流程的處理(業務處理、數據庫存取),可以先將它們放到隊列中等待,這個隊列一般放置在內存,存取速度是非常快的。比如秒殺,可能只要1%的真正秒殺到了商品,而其他沒有秒殺成功的人就不需要進行後續的業務流程了,總體上減輕了服務器的壓力(入口壓力還是存在的)。 - 解耦
可以對隊列中的消息進行異步地處理。生產端(往隊列中放數據)和消費端(從隊列中取數據)不需要相互依賴,互相之間不需要等待對方的響應。
RabbitMQ簡介
說了這麼多概念和理論,RabbitMQ就是這個真正“幹活”的。RabbitMQ是一套開源(MPL)的消息隊列服務軟件。官網地址:https://www.rabbitmq.com/
RabbitMQ是輕量級的,很容易在本地和雲中部署。它支持多種消息傳遞協議,可以部署在分佈式環境中,以滿足高規模、高可用性的需求。
提供了多種工作模式(五種主要工作模式後面會介紹到),可以應對多種應用場景。
RabbitMQ安裝
以CenOS7爲例,安裝RabbitMQ3.8.5版本。
1.RabbitMQ3.8.5需要erlang(21.x版本)的支持。
在這裏有對erlang安裝的詳細介紹:https://packagecloud.io/rabbitmq/erlang
安裝之前,通過這個腳本進行環境配置,以幫你選擇合適的版本:
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.deb.sh | sudo bash
執行腳本之後,就可以通過yum方式安裝erlang了:
yum install erlang
2.socat安裝
RabbitMQ還需要socat的依賴:
yum install socat
3.RabbitMQ安裝準備工作
導入key:
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
rpm --import https://packagecloud.io/gpg.key
下載安裝包:
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-3.8.5-1.el7.noarch.rpm
執行安裝:
rpm -ivh rabbitmq-server-3.8.5-1.el7.noarch.rpm
看到如下顯示,代表安裝成功:
支持通過瀏覽器對rabbitmq進行遠程管理:
rabbitmq-plugins enable rabbitmq_management
啓動RabbitMQ服務:
systemctl start rabbitmq-server
在瀏覽器訪問:
http://主機IP:15672
但是此時還不能直接登錄,否則會提示:User can only log in via localhost.
還需要以下配置:
添加用戶:admin 123456分別代表添加用戶的用戶名密碼:
rabbitmqctl add_user admin 123456
設置剛纔添加的admin用戶爲管理員:
abbitmqctl set_user_tags admin administrator
如下圖:
設置訪問權限:
rabbitmqctl set_permissions -p / admin "." "." ".*"
如下圖:
重啓服務:
systemctl restart rabbitmq-server
最後大功告成: