RabbitMQ學習——基本概念
AMQP
高階訊息佇列協議(Advanced Message Queuing Protocl,AMQP)
具有現代特性的二進位制協議。是一個提供統一訊息服務的應用層標準高階訊息佇列協議,
是應用層協議的一個開放標準,為面向訊息的中介軟體設計的。
AMQP協議模型
- Server(Broker): 接受客戶端的連線,實現AMQP實體服務
- Connection:連線,應用程式與Broker的網路連線
- Channel:網路通道,幾乎所有的操作都在Channel中進行。客戶端可以建立多個Channel,每個Channel代表一個會話任務。
- Message:訊息,伺服器和應用程式需之間傳遞的資料。由Properties和Body組成。Properties可以對訊息進行修飾,比如訊息的優先順序、延遲等高階特性;Body表示訊息體內容
- Virtual host:虛擬主機,用於進行邏輯隔離,最上層的訊息路由(用於劃分具體的服務)。一個Virtual host裡面可以有若干個Exchange和Queue,同一個Virtural Host裡面不能有相同名稱的Exchange或Queue。(類似redis中的不同資料庫)
- Exchange:交換機,接收訊息,根據路由鍵轉發訊息到繫結的佇列。
- Binding:Exchange和Queue之間的虛擬連線,binding中可以包含routing key
- Routing key:路由鍵,一個路由規則,虛擬機器可以用它來確定如何路由一個特定訊息
- Queue:訊息佇列,儲存訊息並將它們轉發給消費者
RabbitMQ
是一個開源的訊息代理佇列伺服器,基於AMQP協議。
優點
- 開源
- 效能優秀
- 穩定性保障
- 提供可靠性訊息投遞模式(confirm)、返回模式(return)
- 與SpringAMQP完美整合
- API豐富
- 叢集模式豐富
- 支援表示式配置
- 支援高可用模式
- 支援映象佇列模型
- 保證資料不丟失的前提做到高可靠性、可用性
高效能的原因
- Erlang語言最初在於交換機領域的架構模式,這樣使得RabbitMQ在Broker之間進行資料互動的效能是非常優秀的
- Erlang的優點:Erlang有著和原生Socket一樣的延遲效能
Rabbit MQ整體架構
P表示Producer,訊息生產者
C表示Consumer,訊息消費者
P把訊息傳遞到了綠色的Exchange,然後Exchange把訊息傳遞到紅色的訊息佇列,再由消費者來訊息訊息。
這樣,生產者不關心訊息投遞到了哪個佇列;消費者也不關心訊息是從哪個Exchange中來的
RabbitMQ訊息流轉流程
生產者生產的訊息投遞到MQ的Exchange(交換機)上,一個交換機可以繫結多個訊息佇列的,根據路由策略(路由鍵)路由訊息到某個訊息佇列上。然後就可以由消費者消費。
安裝與啟動
我們在虛擬機器CentOS7裡面進行安裝
我選擇的是minimal安裝,安裝下面這篇文章配置網路
接下來安裝相關工具:
yum install -y build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm
wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
wget www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm
首先安裝erlang語言的安裝包
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
接下來安裝socat
rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
最後安裝訊息佇列
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
安裝成功了!
接下來修改配置檔案
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
找到
{queue_index_embed_msgs_below, 4096},
{default_user, <<"guest">>},
{default_pass, <<"guest">>},
{default_user_tags, [administrator]},
{default_vhost, <<"/">>},
{default_permissions, [<<".*">>, <<".*">>, <<".*">>]},
{loopback_users, [<<"guest">>]},
修改loopback_users 中的 <<"guest">>
,只保留guest
如:{loopback_users, [guest]},
相關命令
[[email protected] ~]# rabbitmq
rabbitmqctl rabbitmq-plugins rabbitmq-server
輸入rabbitmq按下Tab可以看到以下三個命令:
- rabbitmqctl 控制相關,可以增加佇列、交換機等
- rabbitmq-server 啟停服務
- rabbitmq-plugins 外掛管理
啟動
通過下面的命令啟動RabbitMQ
[[email protected] ~]# rabbitmq-server start &
[1] 20039
通過如下命令檢測是否啟動成功
[[email protected] ~]# lsof -i:5672
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
beam 20151 rabbitmq 48u IPv6 43519 0t0 TCP *:amqp (LISTEN)
停止
[[email protected] ~]# rabbitmqctl stop_app
Stopping node [email protected] ...
開啟視覺化控制檯外掛
rabbitmq-plugins enable rabbitmq_management
然後訪問 http://host:15672/ 即可
使用者名稱密碼都是 guest
rabbitmqctl命令
- 關閉應用:rabbitmqctl stop_app
- 啟動應用:rabbitmqctl start_app
- 檢視節點狀態:rabbitmqctl status
- 新增使用者:rabbitmqctl add_user test test
- 列出所有使用者:rabbitmqctl list_users
[[email protected] ~]# rabbitmqctl list_users
Listing users ...
test []
guest [administrator]
- 建立虛擬主機:rabbitmqctl add_vhost vhostpath
- 列出所有虛擬主機:rabbitmqctl list_vhosts
- 列出虛擬主機上所有許可權:rabbitmqctl list_permissions -p vhostpath
- 刪除虛擬主機:rabbitmqctl delete_vhost vhostpath
- 檢視所有佇列資訊:rabbitmqctl list_queues
- 移除所有資料(需要先停止服務):rabbitmqctl reset
- 組成叢集:
rabbitmqctl join_cluster <clusternode> [--ram]
- 檢視叢集狀態:rabbitmqctl cluster_status
- 忘記節點(移除失效節點):rabbitmqctl forget_cluster_node [–offline]