RabbitMQ細說之開篇

2022-07-24 06:00:31

前言

關於訊息中介軟體的應用場景,小夥伴們應該都耳熟能詳了吧,比如經常提到的削峰填谷、分散式事務、非同步業務處理、巨量資料分析等等,分散式訊息佇列成為其中比較關鍵的橋樑,也就意味著小夥伴們得掌握相關技能;當下相對比較熱門的訊息中介軟體有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),主要功能是儲存訊息並將其轉發給消費者;

具體詳細小夥伴可以看看官網(https://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

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

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

總結

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

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