RabbitMQ 基本原理

2021-08-09 13:17:33 字數 3710 閱讀 4677

mq全稱為message queue, 是一種分布式應用程式的的通訊方法,它是消費-生產者模型的乙個典型的代表,producer往訊息佇列中不斷寫入訊息,而另一端consumer則可以讀取或者訂閱佇列中的訊息。rabbitmq是mq產品的典型代表,是一款基於amqp協議可復用的企業訊息系統。業務上,可以實現服務提供者和消費者之間的資料解耦,提供高可用性的訊息傳輸機制,在實際生產中應用相當廣泛。本文意在介紹rabbitmq的基本原理,包括rabbitmq基本框架,概念,通訊過程等。

rabbitmq系統最核心的元件是exchange和queue,下圖是系統簡單的示意圖。exchange和queue是在rabbitmq server(又叫做broker)端,producer和consumer在應用端。

producer指的是訊息生產者,consumer訊息的消費者。

訊息佇列,提供了fifo的處理機制,具有快取訊息的能力。rabbitmq中,佇列訊息可以設定為持久化,臨時或者自動刪除。

設定為持久化的佇列,queue中的訊息會在server本地硬碟儲存乙份,防止系統crash,資料丟失

設定為臨時佇列,queue中的資料在系統重啟之後就會丟失

設定為自動刪除的佇列,當不存在使用者連線到server,佇列中的資料會被自動刪除

exchange類似於資料通訊網路中的交換機,提供訊息路由策略。rabbitmq中,producer不是通過通道直接將訊息傳送給queue,而是先傳送給exchange。乙個exchange可以和多個queue進行繫結,producer在傳遞訊息的時候,會傳遞乙個routing_key,exchange會根據這個routing_key按照特定的路由演算法,將訊息路由給指定的queue。和queue一樣,exchange也可設定為持久化,臨時或者自動刪除。

exchange有4種型別:direct(預設),fanout, topic, 和headers,不同型別的exchange**訊息的策略有所區別:

direct

直接交換器,工作方式類似於單播,exchange會將訊息傳送完全匹配routing_key的queue

fanout

廣播是式交換器,不管訊息的routing_key設定為什麼,exchange都會將訊息**給所有繫結的queue。

topic

主題交換器,工作方式類似於組播,exchange會將訊息**和routing_key匹配模式相同的所有佇列,比如,routing_key為user.stock的message會**給繫結匹配模式為 * .stock,user.stock, * . * 和#.user.stock.#的佇列。( * 表是匹配乙個任意片語,#表示匹配0個或多個片語)

headers

訊息體的header匹配(ignore)

所謂繫結就是將乙個特定的 exchange 和乙個特定的 queue 繫結起來。exchange 和queue的繫結可以是多對多的關係。

假設p1和c1註冊了相同的broker,exchange和queue。p1傳送的訊息最終會被c1消費。基本的通訊流程大概如下所示:

p1生產訊息,傳送給伺服器端的exchange

exchange收到訊息,根據routinkey,將訊息**給匹配的queue1

queue1收到訊息,將訊息傳送給訂閱者c1

c1收到訊息,傳送ack給佇列確認收到訊息

queue1收到ack,刪除佇列中快取的此條訊息

consumer收到訊息時需要顯式的向rabbit broker傳送basic.ack訊息或者consumer訂閱訊息時設定auto_ack引數為true。在通訊過程中,佇列對ack的處理有以下幾種情況:

如果consumer接收了訊息,傳送ack,rabbitmq會刪除佇列中這個訊息,傳送另一條訊息給consumer。

如果cosumer接受了訊息, 但在傳送ack之前斷開連線,rabbitmq會認為這條訊息沒有被deliver,在consumer在次連線的時候,這條訊息會被redeliver。

如果consumer接受了訊息,但是程式中有bug,忘記了ack,rabbitmq不會重**送訊息。

rabbitmq2.0.0和之後的版本支援consumer reject某條(類)訊息,可以通過設定requeue引數中的reject為true達到目地,那麼rabbitmq將會把訊息傳送給下乙個註冊的consumer。

是message的生產者,publisher這個clients產生了一些message。

consumer:

message的消費者,publisher產生的message,最終要到達consumer這個clients,進行消費。

指定訊息按什麼規則,路由到哪個queue,message訊息先要到達exchange,在server中承擔著從produce接收message的責任。

queue:

到達exchange的訊息,根據制定的規則(routing key)到達對應的queue,在server中承擔著裝載message,是message的容器,等待被消費出去。

routing key:

在exchange和queue之間隱藏有一條黑線,可以將這條黑線看成是routing key,exchange就是根據這些定義好的routing key將message送到對應的queue中去,是exchange和queue之間的橋梁。

broker:

之前一直不理解這個broker,其實broker就是接收和分發訊息的應用,也就是說rabbitmq server就是message broker。

virtualhost:

虛擬主機,乙個broker裡可以開有多個virtualhost,它的作用是用作不同使用者的許可權分離。 

connection:

是publisher/consumer和broker之間的tcp連線。斷開連線的操作只會在publisher/consumer端進行,broker不會斷開連線,除非出現網路故障或者broker服務出現問題,broker服務宕了。

connection: channel:

如果每一次訪問rabbitmq就建立乙個connection,那在訊息量大的時候建立tcp connection的開銷就會很大,導致的後果就是效率低下。

左邊的client向右邊的client傳送訊息,流程:

第一:獲取conection

第二:獲取channel

第三:定義exchange,queue

第四:使用乙個routingkey將queue binding到乙個exchange上

第五:通過指定乙個exchange和乙個routingkey來將訊息傳送到對應的queue上,

第六:consumer在接收時也是獲取connection,接著獲取channel,然後指定乙個queue,到queue上取訊息,它對exchange,routingkey及如何binding都不關心,到對應的queue上去取訊息就行了。

乙個publisher client傳送訊息,哪些consumer client可以收到訊息,在於exchange,routingkey,queue的關係上。

Rabbitmq基本原理

mq全稱為message queue,是一種分布式應用程式的的通訊方法,它是消費 生產者模型的乙個典型的代表,producer往訊息佇列中不斷寫入訊息,而另一端consumer則可以讀取或者訂閱佇列中的訊息。rabbitmq是mq產品的典型代表,是一款基於amqp協議可復用的企業訊息系統。業務上,可...

Rabbitmq基本原理

mq全稱為message queue,是一種分布式應用程式的的通訊方法,它是消費 生產者模型的乙個典型的代表,producer往訊息佇列中不斷寫入訊息,而另一端consumer則可以讀取或者訂閱佇列中的訊息。rabbitmq是mq產品的典型代表,是一款基於amqp協議可復用的企業訊息系統。業務上,可...

Rabbitmq基本原理

mq全稱為message queue,是一種分布式應用程式的的通訊方法,它是消費 生產者模型的乙個典型的代表,producer往訊息佇列中不斷寫入訊息,而另一端consumer則可以讀取或者訂閱佇列中的訊息。rabbitmq是mq產品的典型代表,是一款基於amqp協議可復用的企業訊息系統。業務上,可...