千萬pv網站架構之RabbitMQ
簡介
什麼是RabbitMQ?
MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用鏈接來連接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。
RabbitMQ幾個關鍵的概念的說明:
Broker:簡單來說就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker裏可以開設多個vhost,用作不同用戶的權限分離。
producer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務。
消息隊列的使用過程:
(1)、客戶端連接到消息隊列服務器,打開一個Channel(消息通道)。
(2)、客戶端聲明一個Exchange(消息交換機),並設置相關屬性。
(3)、客戶端聲明一個Queue(消息隊列載體),並設置相關屬性。
(4)、客戶端使用一個Routing Key(路由關鍵字),在Exchange和Queue之間建立好綁定關係。
(5)、客戶端投遞消息到Exchange。
Exchange接收到消息後,就根據消息的Key和已經設置的Binding,進行消息路由,將消息投遞到一個或者多個隊列裏。
RabbitMQ的使用場景
RabbitMQ支持消息的持久化,也就是數據寫在磁盤上。
消息隊列的持久化包括3個部分:
1、Exchange持久化,在聲明時指定durable=>1。
2、Queue持久化,在聲明時指定durable=>1。
3、消息持久化,在投遞時指定delivery_mode=>2(1是非持久化)。
RabbitMQ的實際應用
RabbitMQ模式大概分爲以下三種:
1、單一模式。
2、普通模式(默認的集羣模式)。
3、鏡像模式(把需要的隊列做成鏡像隊列,存在於多個節點,屬於RabbitMQ的HA方案,在對業務可靠性要求較高的場合中比較實用)。
實驗部署
主機名 | IP地址 | 系統用途 |
---|---|---|
CentOS7-1(MQ01) | 172.16.10.138 | 磁盤節點 |
CentOS7-2(MQ02) | 172.16.10.147 | 內存節點 |
CentOS7-5(MQ03) | 172.16.10.146 | 內存節點 |
- 設置每臺服務器的hosts解析文件,添加以下內容
vim /etc/hosts
172.16.10.138 RabbitMQ01
172.16.10.147 RabbitMQ02
172.16.10.146 RabbitMQ03
- 設置每臺服務器的hostname
mq01.localdomain #依次爲mq02 mq03
- 配置安裝帶有RabbitMQ的epel源
yum -y install epel-release
- 使用yum倉庫安裝RabbitMQ軟件
yum install -y rabbitmq-server
- 相關配置及開啓服務
/usr/lib/rabbitmq/bin/rabbitmq-plugins list #查看插件安裝情況
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management #啓用rabbitmq_management服務
systemctl start rabbitmq-server #開啓服務
rabbitmqctl cluster_status #檢查三臺的集羣狀態,目前相互獨立,沒有形成集羣。
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]}]},
{running_nodes,[rabbit@mq01]}, #可以看到此時,是並沒有集羣的
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]}]
...done
- 集羣部署(兩臺內存節點上配置)
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@mq01 #加入到磁盤節點
rabbitmqctl start_app
rabbitmqctl cluster_status #驗證集羣狀態
- 網頁登錄rabbitmq的web管理頁面查看