RabbitMQ細說之開篇

前言

關於消息中間件的應用場景,小夥伴們應該都耳熟能詳了吧,比如經常提到的削峰填谷、分散式事務、非同步業務處理、大數據分析等等,分散式消息隊列成為其中比較關鍵的橋樑,也就意味著小夥伴們得掌握相關技能;當下相對比較熱門的消息中間件有RabbitMQ、Kafaka、RocketMQ、ActiveMQ等,在實際應用場景中,發現很多小夥伴和我一樣都是跟著相關框架(CAP、Masstransit等)文檔進行使用,實現功能,並沒有關注消息隊列相關知識點,總感覺缺少點精髓,所以想著就以RabbitMQ為著手點,一起學習學習相關細節。

正文

1. 簡介

1.1 RabbitMQ 概要

RabbitMQ是基於Erlang語言開發的開源消息中間件,比較輕量級,廣泛應用於分散式系統中存儲消息、轉發消息,具有高可用,高可擴性,易用性等特徵。

RabbitMQ支援多種消息傳遞協議,默認採用的是AMQP協議,通過插件擴展的方式可以支援STOMP、MQTT、RabbitMQ Stream協議。

  • AMQP協議簡單理解

    AMQP:(全稱:Advanced Message Queuing Protocol-是高級消息隊列協議) ,是一個提供統一消息服務的應用層標準高級消息隊列協議,是一種二進位協議;基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不同產品、不同的開發語言等條件的限制。

  • 核心組成部分

    RabbitMQ基於AMQP實現,主要組成部分及流程如下:

    上圖簡介:

    生產者負責將消息投遞到伺服器中,消費者負責訂閱接收消息,然後進行對應的業務處理。經過的核心組成部分如下:

    生產者(Producer) :負責產生消息,並將消息發送到伺服器上;

    消費者(Consumer) :負責消息的消費,即訂閱消息,然後處理相關的業務邏輯;

    Message :消息:服務與應用程式之間傳送的數據,由一些屬性和消息體組成,通過屬性可以設置消息的優先順序,延遲等高級特性;

    伺服器(Server) :又稱Broker ,接受客戶端的連接。保證消息能夠按照指定的方式進行傳輸; 連接(Connection) :應用程式與Broker的網路連接(TCP-IP/ 三次握手和四次揮手); Channel:虛擬連接,它是基於Connection連接建立的,幾乎所有的操作都在Channel中進行,Channel是進行消息讀寫的通道,客戶端可以建立多個Channel,每個Channel代表一個會話任務;

    Virtual Host 虛擬地址,用於進行邏輯隔離,一個虛擬主機可以有若干個Exchange和Queue,同一個虛擬主機裡面不能有相同名字的Exchange; 交換機(Exchange) :接受消息,根據路由鍵投遞消息到綁定的隊列,本身不具備消息存儲的能力; Bindings:Exchange和Queue之間的虛擬關係,Binding中可以有多個routing key; Routing key:是一個路由規則,虛擬機可以用它來確定如何路由一個特定消息; 隊列(Queue) :也稱為消息隊列(Message Queue),主要功能是保存消息並將其轉發給消費者;

具體詳細小夥伴可以看看官網(//www.rabbitmq.com/),接下來我們就開始安裝,然後先上手玩玩。

2. 安裝及介面簡介

2.1 安裝

按照傳統方式安裝,需要進行Erlang語言環境安裝、配置用戶,為了方便,這裡還是用我最喜歡(偷懶)的Docker方式安裝,關於Docker相關係列的教程,點擊《Docker系列》看詳細內容。

這裡演示還是使用阿里雲伺服器,完成Docker環境安裝之後,直接執行如下命令即可完成RabbitMq的安裝:

docker run -di --name RabbitDemo -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management

命令簡介:

-d:指定後台啟動容器;

--name:指定容器名稱為RabbtiDemo;

-e: 指定環境變數,設置RabbitMQ的用戶名和密碼;

-p: 主機埠和容器埠的映射

埠簡介:

  • 5672:RabbitMQ的通訊埠;
  • 15672:RabbitMQ HTTP API的埠,啟動Management插件,可查看和管理RabbitMQ相關資訊。
  • 25672:RabbitMQ節點間的CLI通訊埠;
  • 1883、8883:MQTT插件啟動時的埠。
  • 61613、61614:STOMP客戶端插件啟用時的埠。
  • 15674、15675:基於Websocket的STOMP埠和MOTT埠

我們主要是來說說RabbitMQ默認的協議AMQP,所以這裡只關注5672、15672、25672即可。如果小夥伴也是用雲伺服器,則需要對應的埠添加到安全組和防火牆中。

通過docker ps 命令查看容器運行正常之後,就可以通過瀏覽器訪問RabbitMQ的管理頁面,如下:

輸入安裝時設置的用戶名和密碼就可以登錄到管理主介面了。

2.2 介面初識
  • 首頁概覽

    首頁會展示一些整體資訊,包括消息、節點等相關資訊。

  • 連接(Connections)情況

    對於Connections和Channels而言,默認安裝完是沒有的,這裡為了展示全一點的資訊,搞了個客戶端連上,在後續的程式碼實戰中我們會好好仔細說說。

    點擊隊列名稱可以進入連接詳情,如果對應的用戶有許可權,可以強制關掉對應的連接。

  • Channels情況

    Channel是基於Connection的,一個Connection中可以創建多個Channel,提高傳輸效率。

  • 交換機(Exchangs)管理

    交換機主要用來進行轉發消息,可以只設置模式,將消息投遞到隊列中。

    裡面的具體參數資訊,後續會在實際演示情況的時候一一說到。

  • 隊列(Queues)管理

    隊列就是為存儲消息並將其轉發給消費者。

    點擊隊列進入詳情頁面,可以綁定交換機等操作,如下:

  • 用戶/許可權/虛擬主機(Virtual Host)等管理

    用戶管理

    針對不同的使用場景添加不同的用戶,並設置對應的許可權。

    Virtual Hosts管理

    Virtual Hosts的主要目的就是隔離、分類,可以理解為電腦文件夾,不同的文件進行歸類存放到對應的文件夾中,還可以對其進行設置相關的許可權,這樣就可以讓不同的用戶訪問到不同的隊列、交換機,互不影響。

    創建好的虛擬主機點擊名字進詳情,還能配置對應的許可權。

    FeatureFlags、Policies、Limits、Cluster是一些資訊顯示和額外配置,這裡先不截圖,後續用到的時候再細說。

2.3 角色分類細說

關於用戶角色,RabbitMQ已經內置了幾個,在創建用戶時可以進行選擇,如下圖:

為了演示方便,針對每種角色創建對應的用戶,如下:

每個角色對應的許可權說明如下:

  • Admin(Administrator)

    最高層理許可權,可以查看所有資訊並進行相關資源的管理,如:創建和刪除Virtual Host、創建和刪除用戶、創建permmission、關閉所有用戶的連接。

    上面的截圖就是管理員的操作介面,這裡就不重複截圖了。

  • Monitoring

    可登陸管理控制台,同時可以查看rabbitmq節點的相關資訊(進程數,記憶體使用情況,磁碟使用情況等),可以管理對應的交換機和隊列。

    在管理頁面只能查看策略,其他不能查看和管理:

    其實Limits也不能配置,提示不是管理員許可權:

  • Policymaker

    可登陸管理控制台,但無法查看節點的相關資訊,主要是進行策略的管理,同時也可以管理自己的交換機、隊列;

  • Management

    可登陸管理控制台,無法看到節點相關的資訊,能管理自己相關的交換機、隊列等,無法對策略進行管理,其實可以理解為針對個人管理的許可權。

  • Impersonator

    模擬角色,無法登陸管理控制台

  • None

    不設置角色,無法登陸管理控制台,通常就是普通的生產者和消費者;

最後匯總為一張圖,許可權從低到高,如下:

3. 命令行工具

如果沒有安裝管理介面插件,或者說不喜歡用介面操作,也是可以用命令行工具完成介面的上相關操作的。RabbitMQ提供了如下命令行工具:

  • rabbitmqctl:用於服務管理和一般操作員任務;
  • rabbitmq-diagnostics:用於診斷和健康檢查;
  • rabbitmq-plugins:用於插件管理;
  • rabbitmq-queues:用於隊列上的維護任務,特別是仲裁隊列;
  • rabbitmq-upgrade:用於與升級相關的維護任務;

這裡是將RabbitMQ以容器的方式啟動,所以進入容器可執行命令,以rabbitmqctl為例演示:

增加用戶,執行如下命令:

rabbitmqctl add_user codezyq zyq123456

新增成功,但還沒設置許可權,通過介面也可以看到沒有設置對應的許可權:

設置許可權,如下:

rabbitmqctl set_user_tags codezyq administrator

執行命令很簡單,上面只是演示,命令行工具功能可以實現管理介面的相關功能,小夥伴根據需要執行相關命令即可。

命令的功能解釋進入官網有詳解://www.rabbitmq.com/rabbitmqctl.8.html

總結

關於RabbitMQ安裝和理論先說這麼多,減少一些概念、名詞的糾結。控制篇幅,小夥伴們上WC的時間就能看完~~~;

下一篇聊聊交換機的各種模式,一起通過介面和程式碼的方式進行實踐。關注「Code綜藝圈」,和我一起學習吧。

Tags: