1. 程式人生 > >(2)、rabbitMQ的通訊流程

(2)、rabbitMQ的通訊流程

配圖
在上一篇中,大致介紹了一下rabbitmq(為了方便,以下簡稱rmq)中一些比較重要的概念,對rabbitmq也算是有了一些的瞭解。接下來,我們來看看rabbitmq的訊息傳遞的流程,來熟悉和加深對rabbitmq 的瞭解。

一、rabbitMQ訊息傳遞的流程

rabbitMQ示意圖

這是一個簡單的示意圖。從中可以看到,rmq通訊的大致流程是:訊息的生產者(Producer)與rabbitmq server建立連線,並建立通道(channel);然後把訊息傳送至rabbitmq server上指定的Exchange中的queue裡存放著;當有訊息的消費者(Consumer)監聽了這個queue時,就會接收該訊息。

其中,訊息的消費者和生產者分屬於不同應用,這樣就能成功的使兩個不同的應用通過rabbitmq進行訊息的通訊,而不用考慮兩個應用間直接對接的一些麻煩了。

二、一些需要事先清楚的細枝末節

在上面我們講了通訊的流程中,有一些需要注意的東西沒有提到,這些細節如果不注意的話會導致一些不必要的麻煩。比如:

  • 不管是生產者或者消費者,傳送訊息或監聽queue時都需要指定queue,而每個queue都也都需要繫結到一個exchange上,如果沒有事先建立的話,就需要在傳送或監聽queue前進行宣告,即傳送訊息或監聽的時候通知rabbitmq server建立queue和exchange;至少需要宣告queue。(注:如果只宣告queue不繫結exchange,則會把宣告的queue放置到預設的exchange中,預設的exchange是direct型別的,下一篇會對exchange的型別進行介紹)。如若沒有事先建立,且沒有進行宣告,會造成連不上rabbitmq server的情況。
  • 建立queue或者exchange是需要對它們進行一些引數的設定,queue的建立必須設定是否是永久的queue(即queue中的訊息會進行備份防止丟失)、是否自動刪除(沒有使用者連線到rabbit server時,佇列中的資料會被自動刪除);exchange的建立需要指定型別,是否永久,是否自動刪除等等,具體情形可參看文件或通過rabbitmq server進行了解。這裡有個坑需要注意,比如,我們事先已經建立了一個永久佇列,但是在監聽的時候,我們仍可能會進行宣告以防止切換環境的時候沒有預先建立佇列導致連不上。但是,如果宣告的佇列與事先建立的佇列引數設定不一致的話也是有可能導致連不上server的問題的。
  • 對routingkey的繫結,在真正使用的時候,我們都會給每個queue進行routingkey的繫結,生產者按routingkey傳送訊息,接收者按routingkey接收訊息,當然如果使用環境比較簡單的話,也可以不對routingkey進行繫結。

三、需要了解,可能不大會用到的部分

我們知道訊息的消費者和生產者是屬於應用端的,而exchange和queue是屬於服務端的。在上面的示意圖中,可以看出exchange和queue是放在一個叫做virtual host的容器當中,這其實是一個虛擬概念,有點類似於多個工作空間,每個virtual host裡包含若干個exchange和queue。在平時使用的時候如果沒有對virtual host進行繫結,則預設為rabbitmq server的預設virtual host,如果有建立新的virtual host的話,則在建立exchange和queue時則需要指定。