訊息佇列是指利用佇列這種資料結構進行訊息傳送、快取、接收,使得程序間能相互通訊,是對等的通訊
而訊息代理是對訊息佇列的擴充套件,支援對訊息的路由,是釋出-訂閱模式的通訊,訊息的傳送者並不清楚訊息的接收者,訊息可以被多個消費者接收。
使用訊息佇列的作用如下
非同步:
對於一些使用者的請求,可能包含一些傳送簡訊,傳送郵件等系統處理,此時可以不需要等待短息傳送完成或者郵件傳送完成,而是通過訊息佇列通知這些模組即可返回,避免使用者長時間等待
解耦:
將資料傳送到訊息佇列,對該資料感興趣的系統自行訂閱該訊息即可,這種做法可以降低程式碼的耦合度。
消峰填谷:
將瞬時高並行請求打到訊息隊佇列上,作為資料庫請求的緩衝,避免短時間大量的資料庫請求導致資料庫奔潰。
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消費感興趣訊息佇列中的資料。
Producer:
訊息生產者
Consumer:
訊息消費者
Broker:
訊息代理,這裡指即RabbitMQ,通過訊息代理可以將訊息從生產者投遞到消費者
Virtual host:
虛擬主機,使單個訊息代理能提供了多個相對隔離的環境,隔離的資源包括交換機、佇列等
Exchange:
交換機,作用相當於現實生活的快遞公司,生產者的訊息實際時先投遞到交換機,交換機再根據型別和繫結關係拷貝訊息副本到指定佇列,交換機的型別有direct, topic, headers and fanout
Queue:
佇列,先進先出的優先順序佇列,充當了一個緩衝區的角色,作用相當於現實生活中的菜鳥驛站等代收點
Binding:
交換機和佇列的繫結關係,交換機投遞訊息到指定佇列的規則,作用相當於現實生活中寄快遞時填寫的地址
Connection:
訊息生產者和消費者通過TCP連線到虛擬主機,確保資料傳輸到可靠性
Channel:
共用單個TCP連線的輕量級的Connection,不同Channel通過Channel ID隔離開,互不影響,通常一個程序可以只建立一個TCP連線,減少TCP的資源開銷
可靠性(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):
提供了許多外掛,來從多方面進行擴充套件,也可以編輯自己的外掛
參考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:/#
開啟終端,在終端中輸入
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
通過http://localhost:15672
可以存取管理後臺,預設賬號和密碼均是guest
5672
是AMQP 0-9-1
使用的埠
管理後臺提供了監控和管理RabbitMQ節點和叢集的能力。
管理後臺如下圖所示
通過該管理後臺,可以檢視當前活躍的Connection, Channel, Exchange, Queue等資訊,從圖片可以看出當前活躍的Exchange共有7個,具體的型別覆蓋了direct, topic, headers and fanout四種。
通過這個管理後臺也可以建立或者刪除Connection, Channel, Exchange, Queue