RabbitMQ系列-概念及安裝

2023-05-25 06:02:41

1. 訊息佇列

訊息佇列是指利用佇列這種資料結構進行訊息傳送、快取、接收,使得程序間能相互通訊,是對等的通訊

而訊息代理是對訊息佇列的擴充套件,支援對訊息的路由,是釋出-訂閱模式的通訊,訊息的傳送者並不清楚訊息的接收者,訊息可以被多個消費者接收。

使用訊息佇列的作用如下

非同步:對於一些使用者的請求,可能包含一些傳送簡訊,傳送郵件等系統處理,此時可以不需要等待短息傳送完成或者郵件傳送完成,而是通過訊息佇列通知這些模組即可返回,避免使用者長時間等待

解耦:將資料傳送到訊息佇列,對該資料感興趣的系統自行訂閱該訊息即可,這種做法可以降低程式碼的耦合度。

消峰填谷:將瞬時高並行請求打到訊息隊佇列上,作為資料庫請求的緩衝,避免短時間大量的資料庫請求導致資料庫奔潰。

 

2. RabbitMQ簡介

RabbitMQ是一種開源的多協定訊息代理軟體,它將訊息釋出者(釋出訊息的應用程式,也稱為生產者)接收訊息並將它們路由到消費者(處理訊息的應用程式)。

RabbitMQ支援多種訊息傳遞協定,其中AMQP 0-9-1是核心,並以外掛的形式支援STOM,MQTT,AMQP 1.0。

AMQP,即Advanced Message Queuing Protocol,中文名稱是高階訊息傳遞協定。

AMQP 0-9-1 模型如下圖所示

訊息生產者producer和消費者consumer均通過TCP連線訊息代理broker,生產者producer將訊息投遞到交換機exchange,訊息代理根據訊息佇列queue和交換機exchange的繫結關係bind將訊息推播到對應的訊息佇列queue,最後消費者consumer消費感興趣訊息佇列中的資料。

 

2.1 RabbitMQ中的相關概念

Producer:訊息生產者

Consumer:訊息消費者

Broker:訊息代理,這裡指即RabbitMQ,通過訊息代理可以將訊息從生產者投遞到消費者

Virtual host:虛擬主機,使單個訊息代理能提供了多個相對隔離的環境,隔離的資源包括交換機、佇列等

Exchange:交換機,作用相當於現實生活的快遞公司,生產者的訊息實際時先投遞到交換機,交換機再根據型別和繫結關係拷貝訊息副本到指定佇列,交換機的型別有directtopicheaders and fanout

Queue: 佇列,先進先出的優先順序佇列,充當了一個緩衝區的角色,作用相當於現實生活中的菜鳥驛站等代收點

Binding:交換機和佇列的繫結關係,交換機投遞訊息到指定佇列的規則,作用相當於現實生活中寄快遞時填寫的地址

Connection: 訊息生產者和消費者通過TCP連線到虛擬主機,確保資料傳輸到可靠性

Channel:共用單個TCP連線的輕量級的Connection,不同Channel通過Channel ID隔離開,互不影響,通常一個程序可以只建立一個TCP連線,減少TCP的資源開銷

 

2.2 RabbitMQ特性

可靠性(Reliablity):使用TCP連線進行資料傳輸、且提供了訊息持久化、佇列持久化、生產者傳送確認、消費者消費確認等機制保證訊息的可靠

靈活的路由(Flexible Routing):提供了多種型別的交換機Exchange

訊息叢集(Clustering):多個RabbitMQ伺服器可以組成一個叢集,形成一個邏輯訊息代理Broker

高可用(Highly Avaliable Queues):佇列可以在叢集中的機器上進行映象,使得在部分節點出問題的情況下佇列仍然可用

多種協定(Multi-protocol):支援多種訊息佇列協定,核心是AMQP,通過外掛形式支援STOMP、MQTT等

多種語言使用者端(Many Clients):幾乎支援所有常用語言,比如Java、Python、Golang等

管理介面(Management UI):提供了易用的使用者介面,使得使用者可以監控和管理訊息Broker的許多方面

跟蹤機制(Tracing):如果訊息異常,RabbitMQ提供了訊息的跟蹤機制,使用者可以找出發生了什麼

外掛機制(Plugin System):提供了許多外掛,來從多方面進行擴充套件,也可以編輯自己的外掛

 

3. RabbitMQ安裝

3.1 安裝Docker

參考Install Docker Desktop on Mac安裝docker,安裝完成後點選Docker圖示以啟動Docker服務

這裡簡單介紹幾個常用的docker命令

docker ps -a可以看到Docker啟動過的容器

$ docker ps -a
CONTAINER ID   IMAGE                   COMMAND                   CREATED      STATUS      PORTS                                                                                                         NAMES
8918b9e8bae2   rabbitmq:3-management   "docker-entrypoint.s…"   2 days ago   Up 2 days   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   some-rabbit

docker stop CONTAINER ID停止執行中的容器

$ docker stop 8918b9e8bae2
8918b9e8bae2

docker restart CONTAINER ID重啟容器

$ docker restart 8918b9e8bae2
8918b9e8bae2

docker exec -it CONTAINER ID /bin/bash 可以進入執行容器的終端

$ docker exec -it 8918b9e8bae2 /bin/bash
root@my-rabbit:/#

 

3.2 RabbitMQ安裝及啟動

開啟終端,在終端中輸入

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

通過http://localhost:15672可以存取管理後臺,預設賬號和密碼均是guest

5672AMQP 0-9-1 使用的埠

 

4. 管理後臺

管理後臺提供了監控和管理RabbitMQ節點和叢集的能力。

管理後臺如下圖所示

通過該管理後臺,可以檢視當前活躍的Connection, Channel, Exchange, Queue等資訊,從圖片可以看出當前活躍的Exchange共有7個,具體的型別覆蓋了directtopicheaders and fanout四種。

通過這個管理後臺也可以建立或者刪除Connection, Channel, Exchange, Queue