簡介
AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。
AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、可靠性、安全。
RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
RabbitMQ提供了可靠的消息機制、跟蹤機制和靈活的消息路由,支持消息集羣和分佈式部署。適用於排隊算法、秒殺活動、消息分發、異步處理、數據同步、處理耗時任務、CQRS等應用場景。
RabbitMQ工作機制
首先要知道RabbitMQ的三種角色:生產者、消費者、消息服務器
- 生產者:消息的創建者,負責創建和推送消息到消息服務器
- 消費者:消息的接收方,接受消息並處理消息
- 消息服務器:其實RabbitMQ本身,不會產生和消費消息,相當於一箇中轉站,將生產者的消息路由給消費者
RabbitMQ角色
- Server:又稱broker,接受客戶端的鏈接,實現AMQP實體服務
- Connection:連接,應用程序與broker的網絡連接
- ConnectionFactory:連接管理,應用程序或消費方與RabbitMQ建立連接的管理器
- Channel:網絡信道,幾乎所有的操作都在channel中進行,Channel是進行消息讀寫的通道。客戶端可以建立多個channel,每個channel代表一個會話任務。
- Exchange:交換機,用於接收分配消息到隊列中
- Queue:保存消息
- Routingkey:一個路由規則,消息會攜帶routingKey,決定消息最終的隊列;虛擬機可用它來確定如何路由一個特定消息。(如負載均衡)
- BindingKey:Queue通過bindingKey與交換機綁定;Exchange和Queue之間的虛擬鏈接,binding中可以包換routing key
- Message:消息,服務器與應用程序之間傳送的數據,由Properties和Body組成.Properties可以對消息進行修飾,必須消息的優先級、延遲等高級特性;Body則是消息體內容。
- virtualhost: 虛擬地址,用於進行邏輯隔離,最上層的消息路由。一個virtual host裏面可以有若干個Exchange和Queue,同一個Virtual Host 裏面不能有相同名稱的Exchange 或 Queue。
RabbitMQ整體架構:
部署RabbitMQ
-
rabbitmq:management
: 帶web管理界面 -
rabbitmq
:不帶web管理界面
這裏拉取rabbitmq:management
鏡像
docker pull rabbitmq:management
Run
docker run -d --hostname=rabbitmqhost --name rabbitmq -p 5672:5672 -p 15672:15672 -v /dockerdata/rabbitmq/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_VHOST=v_rabbitmqhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:management
映射5672客戶端通信端口,和15672web管理端口。
參數 | 含義 |
---|---|
hostname | 指定rabbitmq的Host名稱,保持持久化 |
-p 5672 | 客戶端通信端口 |
-p 15672 | webUI管理端口 |
-v /var/lib/rabbitmq | 持久化,和hostname最好一起使用 |
RABBITMQ_DEFAULT_VHOST | 容器Host名稱 |
RABBITMQ_DEFAULT_USER/RABBITMQ_DEFAULT_PASS | 設置賬號密碼,不配置的話 默認guest/guest |
簡化版
docker run -d --hostname=rabbitmqhost --name rabbitmq -p 5672:5672 -p 15672:15672 -v /dockerdata/rabbitmq/data:/var/lib/rabbitmq rabbitmq:management
進入RabbitMQ
docker exec -it rabbitmq bash
命令 | 含義 |
---|---|
rabbitmq-plugins enable rabbitmq_management | 啓用Web控制檯,此鏡像默認啓用;如果使用rabbitmq鏡像此命令開啓 |
rabbitmqctl status | 查看RabbitMQ狀態 |
rabbitmqctl add_user username password | 添加用戶 |
rabbitmqctl set_user_tags username administrator | 賦予用戶管理員權限 |
rabbitmqctl list_users | 查看用戶列表 |
rabbitmqctl delete_user username | 刪除用戶 |
rabbitmqctl oldPassword Username newPassword | 修改用戶密碼 |
訪問rabbitmq:15672
,使用 guest/guest
登錄
Web 管理界面
overview概覽
Admin用戶管理
添加用戶
上面的Tags選項,其實是指定用戶的角色,可選的有以下幾個:
角色 | 權限 |
---|---|
超級管理員(administrator) | 可登陸管理控制檯,可查看所有的信息,並且可以對用戶,策略(policy)進行操作。 |
監控者(monitoring) | 可登陸管理控制檯,同時可以查看rabbitmq節點的相關信息(進程數,內存使用情況,磁盤使用情況等) |
策略制定者(policymaker) | 可登陸管理控制檯, 同時可以對policy進行管理。但無法查看節點的相關信息(上圖紅框標識的部分) |
普通管理者(management) | 僅可登陸管理控制檯,無法看到節點信息,也無法對策略進行管理。 |
其他 | 無法登陸管理控制檯,通常就是普通的生產者和消費者 |
虛擬主機
創建虛擬主機。爲了讓各個用戶可以互不干擾的工作,RabbitMQ添加了虛擬主機(Virtual Hosts)的概念。其實就是一個獨立的訪問路徑,不同用戶使用不同路徑,各自有自己的隊列、交換機,互相不會影響。