[TOC]
# 1. 消息中間件概述
## 1.1. 什么是消息中間件
MQ全稱為Message Queue,消息隊列是應用程序和應用程序之間的通信方法。
-?為什么使用MQ
在項目中,可將一些無需即時返回且耗時的操作提取出來,進行異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。
### 1.1.1 開發中消息隊列通常有如下應用場景:
#### ??**1. 任務異步處理**
??將不需要同步處理的并且耗時長的操作由消息隊列通知消息接收方進行異步處理。提高了應用程序的響應時間。
#### ??**2. 應用程序解耦合**
??MQ相當于一個中介,生產方通過MQ與消費方交互,它將應用程序進行解耦合。
#### ??**3. 削峰填谷**
??如訂單系統,在下單的時候就會往數據庫寫數據。但是數據庫只能支撐每秒1000左右的并發寫入,并發量再高就容易宕機。低峰期的時候并發也就100多個,但是在高峰期時候,并發量會突然激增到5000以上,這個時候數據庫肯定卡死了。
消息被MQ保存起來了,然后系統就可以按照自己的消費能力來消費,比如每秒1000個數據,這樣慢慢寫入數據庫,這樣就不會卡死數據庫了。
但是使用了MQ之后,限制消費消息的速度為1000,但是這樣一來,高峰期產生的數據勢必會被積壓在MQ中,高峰就被“削”掉了。但是因為消息積壓,在高峰期過后的一段時間內,消費消息的速度還是會維持在1000QPS,直到消費完積壓的消息,這就叫做“**填谷**”
## 1.2. AMQP 和 JMS
MQ是消息通信的模型;實現MQ的大致有兩種主流方式:AMQP、JMS。
### 1.2.1. AMQP
AMQP是一種協議,更準確的說是一種binary wire-level protocol(鏈接協議)。這是其和JMS的本質差別,AMQP不從API層進行限定,而是直接定義網絡交換的數據格式。
### 1.2.2. JMS
JMS即Java消息服務(JavaMessage Service)應用程序接口,是一個Java平臺中關于面向消息中間件(MOM)的API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。
### 1.2.3. AMQP 與 JMS 區別
-?JMS是定義了統一的接口,來對消息操作進行統一;AMQP是通過規定協議來統一數據交互的格式
-?JMS限定了必須使用Java語言;AMQP只是協議,不規定實現方式,因此是跨語言的。
-?JMS規定了兩種消息模式;而AMQP的消息模式更加豐富
## 1.3. 消息隊列產品
市場上常見的消息隊列有如下:
-?ActiveMQ:基于JMS
-?ZeroMQ:基于C語言開發
-?RabbitMQ:基于AMQP協議,erlang語言開發,穩定性好
-?RocketMQ:基于JMS,阿里巴巴產品
-?Kafka:類似MQ的產品;分布式消息系統,高吞吐量
## 1.4. RabbitMQ
RabbitMQ是由erlang語言開發,基于AMQP(Advanced Message Queue 高級消息隊列協議)協議實現的消息隊列,它是一種應用程序之間的通信方法,消息隊列在分布式系統開發中應用非常廣泛。
RabbitMQ官方地址:[http://www.rabbitmq.com/](http://www.rabbitmq.com/)
RabbitMQ提供了6種模式:簡單模式,work模式,Publish/Subscribe發布與訂閱模式,Routing路由模式,Topics主題模式,RPC遠程調用模式(遠程調用,不太算MQ;暫不作介紹);
官網對應模式介紹:[https://www.rabbitmq.com/getstarted.html](https://www.rabbitmq.com/getstarted.html)
# 2. vhost
1. 每一個RabbitMQ服務器都能創建虛擬消息服務器,我們稱之為虛擬主機。
2. 每一個vhost本質上是一個mini版的RabbitMQ服務器,擁有自己的交換機、隊列、綁定等,擁有自己的權限機制。
3. vhost之于Rabbit就像虛擬機之于物理機一樣。他們通過在各個實例間提供邏輯上分離,允許為不同的應用程序安全保密的運行數據,這很有,它既能將同一個Rabbit的眾多客戶區分開來,又可以避免隊列和交換器的命名沖突。
4. RabbitMQ提供了開箱即用的默認的虛擬主機“/”,如果不需要多個vhost可以直接使用這個默認的vhost,通過使用缺省的guest用戶名和guest密碼來訪問默認的vhost。vhost之間是相互獨立的,這避免了各種命名的沖突,就像App中的沙盒的概念一樣,每個沙盒是相互獨立的,且只能訪問自己的沙盒,以保證非法訪問別的沙盒帶來的安全隱患。
# 3. 角色
RabbitMQ在安裝好后,可以訪問`http://ip地址:15672` ;其自帶了guest/guest的用戶名和密碼;如果需要創建自定義用戶;那么也可以登錄管理界面后,如下操作:
**1. 超級管理員(administrator)**
可登陸管理控制臺,可查看所有的信息,并且可以對用戶,策略(policy)進行操作。
**2. 監控者(monitoring)**
可登陸管理控制臺,同時可以查看rabbitmq節點的相關信息(進程數,內存使用情況,磁盤使用情況等)
**3.策略制定者(policymaker)**
可登陸管理控制臺, 同時可以對policy進行管理。但無法查看節點的相關信息(上圖紅框標識的部分)。
**4. 普通管理者(management)**
僅可登陸管理控制臺,無法看到節點信息,也無法對策略進行管理。
**5. 其他**
無法登陸管理控制臺,通常就是普通的生產者和消費者。