RabbitMQ介紹
MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。
RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQ是AMQP(高級消息隊列協議)的標準實現。
RabbitMQ原理圖示
Exchange四種匹配模式
fanout:將生產者發送的信息推送到所有與他綁定的Queue;
direct:精準匹配,當routing key=binding key時,將信息發送到對應的Queue;
topic:模糊匹配,當滿足部分規則時,將信息發送到對應的Queue;
headers:不依賴routing key,binding key匹配規則,依據消息內容headers屬性匹配。
關鍵概念介紹
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。
RabbitMQ實驗搭建
配置信息:
配置步驟:
一、更改主機名(防止啓動服務時出現故障):
mq01/mq02/mq03:
vim /etc/hostname
mq01.localdomain
vim /etc/hosts
192.168.218.156 mq01
192.168.218.145 mq02
192.168.218.139 mq03
二、構建獨立的服務器
mq01/mq02/mq03:
systemctl stop firewalld.service
setenforce 0
yum install epel-release -y
yum install rabbitmq-server -y
ln -s /usr/lib/rabbitmq/bin/* /usr/bin/
rabbitmq-plugins list //查看插件安裝情況
rabbitmq-plugins enable rabbitmq_management //啓用rabbitmq_management管理
systemctl start rabbitmq-server.service //開啓服務
rabbitmqctl cluster_status //檢查集羣狀態(主機名未解析會報error)
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]}]},
{running_nodes,[rabbit@mq01]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]}]
...done.
三、構建RabbitMQ羣集
mq01/mq02/mq03:
systemctl stop rabbitmq-server.service
[root@mq01 ~]# cat /var/lib/rabbitmq/.erlang.cookie
FDFUVYLHUIERZZNQUKPM //同步三臺cookie相同
systemctl start rabbitmq-server.service
內存節點 mq02/03
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@mq01 //以內存節點形式存在
rabbitmqctl start_app
rabbitmqctl cluster_status //檢查集羣狀態
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},
{running_nodes,[rabbit@mq03,rabbit@mq02,rabbit@mq01]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]}]
...done.
http://192.168.218.156:15672/ //登錄磁盤節點服務器 //默認用戶名:guest 密碼:guest