企業實戰(11)消息隊列之Docker安裝部署RabbitMQ實戰

什麼叫消息隊列

 消息(Message)是指在應用間傳送的數據。消息可以非常簡單,比如只包含文本字符串,也可以更復雜,可能包含嵌入對象。

 消息隊列(Message Queue)是一種應用間的通信方式,消息發送後可以立即返回,由消息系統來確保消息的可靠傳遞。消息發佈者只管把消息發佈到 MQ 中而不用管誰來取,消息使用者只管從 MQ 中取消息而不管是誰發佈的。這樣發佈者和使用者都不用知道對方的存在。

爲何用消息隊列

 從上面的描述中可以看出消息隊列是一種應用間的異步協作機制,那什麼時候需要使用 MQ 呢?

 以常見的訂單系統爲例,用戶點擊【下單】按鈕之後的業務邏輯可能包括:扣減庫存、生成相應單據、發紅包、發短信通知。在業務發展初期這些邏輯可能放在一起同步執行,隨着業務的發展訂單量增長,需要提升系統服務的性能,這時可以將一些不需要立即生效的操作拆分出來異步執行,比如發放紅包、發短信通知等。這種場景下就可以用 MQ ,在下單的主流程(比如扣減庫存、生成相應單據)完成之後發送一條消息到 MQ 讓主流程快速完結,而由另外的單獨線程拉取MQ的消息(或者由 MQ 推送消息),當發現 MQ 中有發紅包或發短信之類的消息時,執行相應的業務邏輯。

 以上是用於業務解耦的情況,其它常見場景包括最終一致性、廣播、錯峯流控等等。

RabbitMQ 特點

 RabbitMQ 是一個由 Erlang 語言開發的 AMQP 的開源實現。

 AMQP :Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。

 RabbitMQ 最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。具體特點包括:

1.可靠性(Reliability)

 RabbitMQ 使用一些機制來保證可靠性,如持久化、傳輸確認、發佈確認。

2.靈活的路由(Flexible Routing)

 在消息進入隊列之前,通過 Exchange 來路由消息的。對於典型的路由功能,RabbitMQ 已經提供了一些內置的 Exchange 來實現。針對更復雜的路由功能,可以將多個 Exchange 綁定在一起,也通過插件機制實現自己的 Exchange 。

3.消息集羣(Clustering)

 多個 RabbitMQ 服務器可以組成一個集羣,形成一個邏輯 Broker 。

4.高可用(Highly Available Queues)

 隊列可以在集羣中的機器上進行鏡像,使得在部分節點出問題的情況下隊列仍然可用。

5.多種協議(Multi-protocol)

 RabbitMQ 支持多種消息隊列協議,比如 STOMP、MQTT 等等。

6.多語言客戶端(Many Clients)

 RabbitMQ 幾乎支持所有常用語言,比如 Java、.NET、Ruby 等等。

7.管理界面(Management UI)

 RabbitMQ 提供了一個易用的用戶界面,使得用戶可以監控和管理消息 Broker 的許多方面。

8.跟蹤機制(Tracing)

 如果消息異常,RabbitMQ 提供了消息跟蹤機制,使用者可以找出發生了什麼。

9.插件機制(Plugin System)

 RabbitMQ 提供了許多插件,來從多方面進行擴展,也可以編寫自己的插件。

RabbitMQ 中的概念模型

消息模型

 所有 MQ 產品從模型抽象上來說都是一樣的過程:

  消費者(consumer)訂閱某個隊列。生產者(producer)創建消息,然後發佈到隊列(queue)中,最後將消息發送到監聽的消費者。
在這裏插入圖片描述

RabbitMQ 基本概念

 上面只是最簡單抽象的描述,具體到 RabbitMQ 則有更詳細的概念需要解釋。上面介紹過 RabbitMQ 是 AMQP 協議的一個開源實現,所以其內部實際上也是 AMQP 中的基本概念:
在這裏插入圖片描述
1.Message

 消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對於其他消息的優先權)、delivery-mode(指出該消息可能需要持久性存儲)等。

2.Publisher

 消息的生產者,也是一個向交換器發佈消息的客戶端應用程序。

3.Exchange

 交換器,用來接收生產者發送的消息並將這些消息路由給服務器中的隊列。

4.Binding

 綁定,用於消息隊列和交換器之間的關聯。一個綁定就是基於路由鍵將交換器和消息隊列連接起來的路由規則,所以可以將交換器理解成一個由綁定構成的路由表。

5.Queue

 消息隊列,用來保存消息直到發送給消費者。它是消息的容器,也是消息的終點。一個消息可投入一個或多個隊列。消息一直在隊列裏面,等待消費者連接到這個隊列將其取走。

6.Connection

 網絡連接,比如一個TCP連接。

7.Channel

 信道,多路複用連接中的一條獨立的雙向數據流通道。信道是建立在真實的TCP連接內地虛擬連接,AMQP 命令都是通過信道發出去的,不管是發佈消息、訂閱隊列還是接收消息,這些動作都是通過信道完成。因爲對於操作系統來說建立和銷燬 TCP 都是非常昂貴的開銷,所以引入了信道的概念,以複用一條 TCP 連接。

8.Consumer

 消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序。

9.Virtual Host

 虛擬主機,表示一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。每個 vhost 本質上就是一個 mini 版的 RabbitMQ 服務器,擁有自己的隊列、交換器、綁定和權限機制。vhost 是 AMQP 概念的基礎,必須在連接時指定,RabbitMQ 默認的 vhost 是 / 。

10.Broker

 表示消息隊列服務器實體。

RabbitMQ 部署

1.查找rabbitmq:management鏡像

注意:

 rabbitmq是官方鏡像,該鏡像不帶控制檯。如果要安裝帶控制檯的鏡像,需要在拉取鏡像時附帶tag標籤,例如:management。

tag標籤可以通過https://hub.docker.com/_/rabbitmq?tab=tags來查詢。

docker search rabbitmq (該鏡像不帶管理界面)

docker search rabbitmq:management (該鏡像帶管理界面)

[root@test2 ~]# docker search rabbitmq:management
NAME                                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
macintoshplus/rabbitmq-management   Based on rabbitmq:management whit python and…   6                                       [OK]
xiaochunping/rabbitmq               xiaochunping/rabbitmq:management   2018-06-30   4
transmitsms/rabbitmq-sharded        Fork of rabbitmq:management with sharded_exc…   0

2.拉取rabbitmq:management鏡像

[root@test2 ~]# docker pull rabbitmq:management
management: Pulling from library/rabbitmq
23884877105a: Downloading [============================>                      ]  15.24MB/26.69MB
bc38caa0f5b9: Download complete
2910811b6c42: Download complete
36505266dcc6: Download complete
15c38f93e1dd: Download complete
160ce6f9b6ab: Downloading [============>                                      ]   8.12MB/32.42MB
bea03dbbcbee: Waiting
518863ae2330: Waiting
7d30148aca81: Waiting
4383d40ea264: Waiting
69e2730d6143: Waiting
669cf5de5f0c: Waiting

[root@test2 ~]# docker images    //查看剛纔拉取的rabbitmq鏡像
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
rabbitmq                        management               cc86ffa2f398        2 weeks ago         186MB

3.運行rabbitmq容器

-d:後臺運行容器

--name:指定容器名

-p:指定服務運行的端口(5672:應用訪問端口;15672:控制檯Web端口號)

-v:映射目錄或文件,啓動了一個數據卷容器,數據卷路徑爲:/var/lib/rabbitmq,再將此數據卷映射到住宿主機的/data目錄

--hostname:主機名(RabbitMQ的一個重要注意事項是它根據所謂的 “節點名稱” 存儲數據,默認爲主機名)

-e:指定環境變量;(RABBITMQ_DEFAULT_VHOST:默認虛擬機名;RABBITMQ_DEFAULT_USER:默認的用戶名;RABBITMQ_DEFAULT_PASS:默認用戶名的密碼)

--restart=always:當Docker重啓時,容器能自動啓動

rabbitmq:management:鏡像名

[root@test2 ~]# docker run -itd --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:management
8232a3af368dad3f7f193c650c29e7668e67ce04489933ee3c26b0d11e1df26a

[root@test2 ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                                                                                        NAMES
8232a3af368d        rabbitmq:management   "docker-entrypoint.s…"   About a minute ago   Up 43 seconds       4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbitmq

[root@test2 ~]# ss -antulp | grep :15672
tcp    LISTEN     0      128      :::15672                :::*                   users:(("docker-proxy",pid=71908,fd=4))

[root@test2 ~]# ss -antulp | grep :5672
tcp    LISTEN     0      128      :::5672                 :::*                   users:(("docker-proxy",pid=71920,fd=4))

4.查看 RabbitMQ 容器進程信息

啓動容器:docker start rabbitmq

停止容器:docker stop rabbitmq

重啓容器:docker restart rabbitmq

[root@test2 ~]# docker top rabbitmq
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             71945               71927               0                   15:01               pts/0               00:00:00            /bin/sh /opt/rabbitmq/sbin/rabbitmq-server
polkitd             72049               71945               0                   15:01               ?                   00:00:00            /usr/local/lib/erlang/erts-11.0.2/bin/epmd -daemon
polkitd             72237               71945               35                  15:01               pts/0               00:00:46            /usr/local/lib/erlang/erts-11.0.2/bin/beam.smp -W w -K true -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -B i -- -root /usr/local/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa -noshell -noinput -s rabbit boot -boot start_sasl -lager crash_log false -lager handlers []
polkitd             72333               72237               0                   15:01               ?                   00:00:00            erl_child_setup 1048576
polkitd             72385               72333               0                   15:01               ?                   00:00:00            inet_gethost 4
polkitd             72386               72385               0                   15:01               ?                   00:00:00            inet_gethost 4

訪問RabbitMQ控制檯

RabbitMQ默認的用戶名:guest,密碼:guest

5672:應用訪問端口;15672:控制檯Web端口號
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章