1. 程式人生 > >RabbitMQ學習——基本概念

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安裝,安裝下面這篇文章配置網路

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]