1. 程式人生 > 實用技巧 >02訊息佇列系列-RabbitMQ的初步認識、安裝、web管理端使用

02訊息佇列系列-RabbitMQ的初步認識、安裝、web管理端使用

02訊息佇列系列-RabbitMQ的初步認識、安裝、web管理端使用

參考連結:
深入剖析 rabbitMQ

一、關於RabbitMQ

RabbitMQ 本質其實是用 Erlang 開發的 AMQP(Advanced Message Queuing Protocol )的具體實現,最初起源於金融系統,主要用於在分散式系統中儲存轉發訊息,在易用性、擴充套件性、高可用性等方面有著不俗的表現。

2010年4月,RabbitMQ 科技公司被 VMware 旗下的 SpringSource 收購,在 2013 年 5 月被併入 Pivotal 。

其實 VMware,Pivotal 本質上是一家的。不同的是,VMware 是獨立上市子公司,而 Pivotal 是整合了EMC的某些資源,現在並沒有上市。其中我們現在使用的 Spring 系列框架,就是 Pivotal 公司熱門的產品之一。

直到後來 Pivotal 將其開源,RabbitMQ 才逐漸走向大眾!

二、RabbitMQ模型介紹

2.1 內部結構分析

RabbitMQ 本質是 AMQP 協議的一個開源實現,在詳細介紹 RabbitMQ 之前,我們先來看一下 AMQP 的內部結構圖!

基本概念如下:

  • Publisher:訊息的生產者,也是一個向交換器釋出訊息的客戶端應用程式
  • Exchange:交換器,用來接收生產者傳送的訊息並將這些訊息路由給伺服器中的佇列
  • Binding:繫結,用於將訊息佇列和交換器之間建立關聯。一個繫結就是基於路由將交換器和訊息佇列連線起來的路由規則,所以可以將它理解稱一個由繫結構成的路由表。
  • Queue:訊息佇列,用來儲存訊息直到傳送給消費者
  • Connection:網路連線,比如一個TCP連線
  • Virtual Host:虛擬主機,表示一批交換器、訊息佇列和相關物件。虛擬主機是共享相同的身份認證和加密環境的獨立伺服器域。每個vhost本質上就是一個mini版的RabbitMQ伺服器,擁有自己的佇列、交換器、繫結和許可權機制。vhost是AMQP概念的基礎,必須在連線時指定,RabbitMQ預設的vhost是/
  • Broker:表示訊息佇列伺服器實體
  • Message:訊息實體,它由訊息頭和訊息體組成。訊息頭主要由路由鍵、交換器、佇列、priority(相對於其他訊息的優先權)、delivery-mode(指出該訊息可能需要永續性儲存)等屬性組成,而訊息體就是指具體的業務物件

相比傳統JMS模型,AMQP主要多了Exchange、Binding這個新概念。


在 AMQP 模型中,訊息的生產者不是直接將訊息傳送到Queue佇列,而是將訊息傳送到Exchange交換器,其中還新加了一箇中間層Binding繫結,作用就是通過路由鍵Key將交換器和佇列建立繫結關係。


就好比類似使用者表角色表,中間通過使用者角色表來將使用者和角色建立關係,從而實現關係繫結,在 RabbitMQ 中,訊息生產者不直接跟佇列建立關係,而是將訊息傳送到交換器之後,由交換器通過已經建立好的繫結關係,將訊息傳送到對應的佇列!

RabbitMQ 最終的架構模型,核心部分就變成如下圖所示:

從圖中很容易看出,與 JMS 模型最明顯的差別就是訊息的生產者不直接將訊息傳送給佇列,而是由Binding繫結決定交換器的訊息應該傳送到哪個佇列,進一步實現了在訊息的推送方面,更加靈活!

2.2 交換器分發策略

當訊息的生產者將訊息傳送到交換器之後,是不會儲存訊息的,而是通過中間層繫結關係將訊息分發到不同的佇列上,其中交換器的分發策略分為四種:Direct、Topic、Headers、Fanout!

  • Direct:直連型別,即在繫結時設定一個 routing_key,訊息的 routing_key 匹配時,才會被交換器投送到繫結的佇列中去,原則是先匹配、後投送
  • Topic:按照規則轉發型別,支援萬用字元匹配,和Direct功能一樣,但是在匹配 routing_key的時候,更加靈活,支援萬用字元匹配,原則也是先匹配、後投送
  • Headers:頭部資訊匹配轉發型別,根據訊息頭部中的 header attribute引數型別,將訊息轉發到對應的佇列,原則也是先匹配、後投送
  • Fanout:廣播型別,將訊息轉發到所有與該交換機繫結的佇列上,不關心 routing_key

2.2.1 Direct

Direct 是 RabbitMQ 預設的交換機模式,也是最簡單的模式,訊息中的路由鍵(routing key)如果和 Binding 中的 binding key 一致, 交換器就將訊息發到對應的佇列中。

如果傳入的 routing key 為black,不會轉發到black.green。Direct 型別交換器是完全匹配、單播的模式

2.2.2 Topic

Topic 型別交換器轉發訊息和 Direct 一樣,不同的是:它支援萬用字元轉發,相比 Direct 型別更加靈活!

兩種萬用字元:*只能匹配一個單詞,#可以匹配零個或多個。

如果傳入的 routing key 為black#,不僅會轉發到black,也會轉發到black.green


2.2.3 Headers

headers 也是根據規則匹配, 相比 direct 和 topic 固定地使用 routing_key , headers 則是通過一個自定義匹配規則的訊息頭部類進行匹配。

在佇列與交換器繫結時,會設定一組鍵值對規則,訊息中也包括一組鍵值對( headers 屬性),當這些鍵值對有一對, 或全部匹配時,訊息被投送到對應佇列。

此外 headers 交換器和 direct 交換器完全一致,但效能差很多,目前幾乎用不到了。

2.2.4 Fanout

Fanout 型別交換器與上面幾個不同,不管路由鍵或者是路由模式,會把訊息發給繫結給它的全部佇列,如果配置了 routing_key 會被忽略,也被成為訊息廣播模式。很像子網廣播,每臺子網內的主機都獲得了一份複製的訊息。

fanout 型別轉發訊息在四種類型中是最快的。

三、RabbitMQ安裝

RabbitMQ 基於 erlang 進行通訊,相比其它的軟體,安裝有些麻煩,為了跟生產環境保持一直,作業系統選擇CentOS7,不過本例採用rpm方式安裝,任何新手都可以完成安裝,過程如下!

3.1 安裝前命令準備

輸入如下命令,完成安裝前的環境準備。

yum install lsof  build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz wget vim

3.2 下載RabbitMQ、erlang、socat的安裝包

本次下載的是RabbitMQ-3.6.5版本,採用rpm一鍵安裝,適合新手直接上手。
先建立一個rabbitmq目錄,本例的目錄路徑為/usr/app/rabbitmq,然後在目錄下執行如下命令,下載安裝包!

  • 下載erlang
wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm
  • 下載socat
wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
  • 下載RabbitMQ
wget www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm


最終目錄檔案如下:

3.3 安裝安裝包

下載完之後,按順序依次安裝軟體包,這個很重要哦~

  • 安裝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
  • 安裝rabbitmq
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

安裝完成之後,修改rabbitmq的配置,預設配置檔案在/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin目錄下。

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app

修改loopback_users節點的值!

最後只需通過如下命令,啟動服務即可!

rabbitmq-server start &

執行指令碼之後,如果報錯,例如下圖!

解決辦法如下:

vim /etc/rabbitmq/rabbitmq-env.conf

在檔案裡新增一行,如下配置!

NODENAME=rabbit@localhost

然後,再儲存!再次以下命令啟動服務!

rabbitmq-server start &

通過如下命令,查詢服務是否啟動成功!

lsof -i:5672

如果出現5672已經被監聽,說明已經啟動成功!

3.4 啟動視覺化的管控臺

輸入如下命令,啟動控制檯!

rabbitmq-plugins enable rabbitmq_management

用瀏覽器開啟http://ip:15672,這裡的ip就是 CentOS 系統的 ip,結果如下:

賬號、密碼,預設為guest,如果出現無法訪問,檢測防火牆是否開啟,如果開啟將其關閉即可!
登入之後的監控平臺,介面如下:

3.5 Docker引擎下安裝啟動RabbitMQ

3.5.1 進入docker hub映象倉庫地址

https://hub.docker.com/

3.5.2 搜尋RabbitMQ

進入官方的映象,可以看到以下幾種型別的映象;我們選擇帶有“mangement”的版本(包含web管理頁面


3.5.3 拉取映象

docker pull rabbitmq:3.7.7-management

使用:docker images 檢視所有映象

3.5.4 根據下載的映象建立和啟動容器

docker run -d  -p 5672:5672 -p 15672:15672

-d 後臺執行容器
-p指定服務執行的埠(5672:應用訪問埠;15672:控制檯Web埠號)

3.5.5 使用瀏覽器開啟web管理端:http://Server-IP:15672


四、web介面使用

進入 web 管理介面之後,可以很清晰的看到分了 6 個選單目錄,分別是:Overview、Connections、Channels、Exchanges、Queues、Admin

4.1 Overview

4.1.1 Overview-> Totals


4.1.1.1 Queued message 所有佇列的阻塞情況

  • Ready:待消費的訊息總數
  • Unacked:待應答的訊息總數
  • Total:總數 Ready+Unacked

4.1.1.2 Message rates 所有佇列的消費情況

速率=(num1-num0)/(s1-s0)
num1:s1時刻的個數
num0:s0時刻的個數

  • Disk read:queue從磁碟讀取訊息的速率。
  • Disk write:queue從磁碟寫入訊息的速率。

4.1.1.3 整體角色的個數

  • Connections:client的tcp連線的總數。
  • Channels:通道的總數。
  • Exchange:交換器的總數。
  • Queues:佇列的總數。
  • Consumers:消費者的總數。

4.1.2 Overview-> Nodes


啟動一個broker都會產生一個node。

4.1.2.1 broker的屬性

  • Name:broker名稱
  • File descriptors:broker開啟的檔案描述符和限制。
  • Socket descriptors:broker管理的網路套接字數量和限制。當限制被耗盡時,RabbitMQ將停止接受新的網路連線。
  • Erlang processes:erlang啟動的程序數。
  • Memory:當前broker佔用的記憶體。
  • Disk space:當前broker佔用的硬碟。
  • Uptime:當前broker持續執行的時長。
  • Info:未知。
  • Reset stats:未知。

4.1.3 Overview-> Ports and contexts


4.1.4 Overview-> Export definitions

定義由使用者,虛擬主機,許可權,引數,交換,佇列和繫結組成。 它們不包括佇列的內容或叢集名稱。 獨佔佇列不會被匯出。

4.1.5 Overview-> Inport definitions

匯入的定義將與當前定義合併。 如果在匯入過程中發生錯誤,則所做的任何更改都不會回滾。

4.2 Connections

當前所有客戶端活動的連線。包括生成者和消費者。

  • Name:名稱。
  • User name:使用的使用者名稱。
  • State:當前的狀態,running:執行中;idle:空閒。
  • SSL/TLS:是否使用ssl進行連線。
  • Protocol:使用的協議。
  • Channels:建立的channel的總數。
  • From client:每秒發出的資料包。
  • To client:每秒收到的資料包。

4.3 Channels

當前連線所有建立的通道。

  • channel:名稱。
  • User name:使用的使用者名稱。
  • Mode:渠道保證模式。 可以是以下之一,或者不是:C: confirm。T:transactional(事務)。
  • State :當前的狀態,running:執行中;idle:空閒。
  • Unconfirmed:待confirm的訊息總數。
  • Prefetch:設定的prefetch的個數。
  • Unacker:待ack的訊息總數。
  • publish:producter pub訊息的速率。
  • confirm:producter confirm訊息的速率。
  • deliver/get:consumer 獲取訊息的速率。
  • ack:consumer ack訊息的速率。

點選具體某個具體的通道,可以看到對應的消費佇列等資訊。

4.4 Exchanges


Name:名稱。
Type:exchange type
Features:功能。 可以是以下之一,或者不是:D: 持久化。I:Internal,存在該功能表示這個exchange不可以被client用來推送訊息,僅用來進行exchange和exchange之間的繫結,否則可以推送訊息也可以繫結。
Message rate in:訊息進入的速率。
Message rate out:訊息出去的速率。

4.4.1 Exchanges-> Add a new exchange

新增一個交換器

  • Name:交換器名稱
  • Type:交換器型別
  • Durability:是否持久化,Durable:持久化,Transient:不持久化
  • Auto delete:是否自動刪除,當最後一個繫結(佇列或者exchange)被unbind之後,該exchange 自動被刪除
  • Internal:是否是內部專用exchange,是的話,就意味著我們不能往該exchange裡面發訊息
  • Arguments:引數,是AMQP協議留給AMQP實現做擴充套件使用的


我們先新建一個名稱為hello-exchange,型別為direct的交換器,結果如下。

等會用於跟佇列關聯!

4.5 Queues

佇列管理

  • Name:名稱。
  • Type:佇列型別
  • Features:功能。 可以是以下之一,或者不是:D: 持久化。
  • State:當前的狀態,running:執行中;idle:空閒。
  • Ready:待消費的訊息總數。
  • Unacked:待應答的訊息總數。
  • Total:總數 Ready+Unacked。
  • incoming:訊息進入的速率。
  • deliver/get:訊息獲取的速率。
  • ack:訊息應答的速率。

4.5.1 Queues-> Add a new queue

  • Type:佇列型別
  • Name:佇列名稱
  • Durability:是否持久化,Durable:持久化,Transient:不持久化
  • Auto delete:是否自動刪除,是的話,當佇列內容為空時,會自動刪除佇列
  • Arguments:引數,是AMQP協議留給AMQP實現做擴充套件使用的

同樣的,新建一個名稱為hello-mq的訊息佇列,結果如下。

佇列新建好了之後,繼續來建立繫結關係!

4.5.1.1 繫結佇列

建立繫結關係,既可以從佇列進入也可以從交換器進入。

  • 如果是從交換器進入,那麼被關聯的物件就是佇列。

  • 如果是從佇列進入,那麼被關聯的物件就是交換器。


我們選擇從佇列入手,被繫結的交換器是hello-exchange,因為型別是direct,所以還需要填寫routing key

建立完成之後,在交換器那邊也可以看到對應的繫結關係。

4.5.1.2 傳送訊息

最後,我們從交換器入手,選擇對應的交換器,點選Publish message標籤,填寫對應的路由鍵 key,傳送一下資料,檢視資料是否傳送到對應的佇列中。

然後點選進入 Queues 選單,查詢訊息佇列基本情況。

然後選擇hello-mq訊息佇列,點選Get messages標籤,獲取佇列中的訊息。

結果如下,可以很清晰的看到,訊息寫入到佇列!

4.6 Admin

系統管理,主要介紹使用者、虛擬主機、許可權等資訊

  • Name:名稱。
  • Tags:角色標籤,只能選取一個。
    • administrator (超級管理員)
      • 可登陸管理控制檯(啟用management plugin的情況下),可檢視所有的資訊,並且可以對使用者,策略(policy)進行操作。
    • monitoring(監控者)
      • 可登陸管理控制檯(啟用management plugin的情況下),同時可以檢視rabbitmq節點的相關資訊(程序數,記憶體使用情況,磁碟使用情況等)
    • policymaker(策略制定者)
      • 可登陸管理控制檯(啟用management plugin的情況下), 同時可以對policy進行管理。
    • management(普通管理者)
      • 僅可登陸管理控制檯(啟用management plugin的情況下),無法看到節點資訊,也無法對策略進行管理。
    • none(其他)
      • 無法登陸管理控制檯,通常就是普通的生產者和消費者。
  • Can access virtual hosts:允許進入的vhost。
  • Has password:設定了密碼。

到此結束