RabbitMQ 介紹(二)- RabbitMQ 用法介紹

古古

2024/10/22


前期提要:如果不了解什麼是 Message Queue,可以先參考 RabbitMQ 介紹(一)- 什麼是 Message Queue? 的介紹

RabbitMQ 是在各企業中最為廣泛使用的 Message Queue,而在 RabbitMQ 的世界中,有三個重要的角色需要了解,分別是:

  • Producer(生產者):負責發送 message 到 Queue
  • Consumer(消費者):負責從 Queue 中接收 message
  • Queue:暫存 message 的地方

以下圖為例,綠色的「訂單系統」是 Producer,藍色的「數據分析系統」是 Consumer,而橘色的「Message Queue」則是 Queue。

在 RabbitMQ 的世界,Producer、Consumer、以及 Queue,是最重要的三個名詞,因此先了解這些名詞的意義,可以說是認識 RabbitMQ 的第一步。

RabbitMQ 中常見的 5 種模式 #

在 RabbitMQ 中,常見的 5 種模式如下(所有模式可參考 RabbitMQ 官網 ):

  1. Direct 模式
  2. Worker 模式
  3. Publish/Subscribe 模式
  4. Routing 模式
  5. Topics 模式

1. Direct 模式 #

Direct 是最簡單的模式,也就是只有一個 Producer 負責發送 message 到 Queue 裡,並且也只有一個 Consumer 會從 Queue 中接收 message,接著處理該 message。

像是以上面的「訂單系統」和「數據分析系統」的例子來說,他們其實就是使用最簡單的 Direct 模式,由「訂單系統」這個 Producer 負責發送 message,並且由「數據分析系統」這個 Consumer 接收 message。

2. Worker 模式 #

Worker 模式和 Direct 模式很像,差別只在 Worker 模式「同時有多個 Consumer」一起去接收 Queue 裡面的 message,進而提升 message 消化的速率。

Worker 模式是 RabbitMQ 中滿常用的一個模式,假設今天 Queue 突然有很多 message 要處理,就可以多叫幾台 Consumer 來一起消化,因此可以輕易的達成「橫向擴展」,在實作上非常的好用!

3. Publish/Subscribe 模式 #

Publish/Subscribe 模式也是 RabbitMQ 中很常用的一種模式。從這個模式之後,在 Producer 和 Queue 之間,就會多出一個叫做 「Exchange」 的角色。

所以在 Publish/Subscribe 模式中,Producer 就不會直接把 message 丟到 Queue 裡面了,Producer 反而是會先把 message 丟給 Exchange,然後再交由 Exchange 去決定要把這個 message 丟到哪個 Queue 裡面。

所以換句話說的話,就是 Producer 再也不會直接和 Queue 溝通了,而是會藉由一個中間人 Exchange 去處理這樣。

而在 Exchange 中,他有 3 種類型(type)可以選(directfanouttopic),所以在下面不同的模式中,就會搭配不同的 Exchange 設定來實作。

像是在 Publish/Subscribe 的模式中,Exchange 使用的是 fanout 設定,也就是當 Producer 把 message 丟給 Exchange 時,Exchange 會把這個 message 丟到「他綁定的所有 Queue」中。

舉例來說的話,假設今天 Producer 發送了一個 message 給 Exchange,那麼 Exchange 除了會將這個 message 丟到上面那條 Queue 裡面之外,同時 Exchange 也會 「複製一份 message」,然後將他丟到下面那條 Queue 裡面。

所以在上下這兩條 Queue 中,裡面都會各自有一份 message 存在!

因此即使 Producer 只傳送了一個 message 給 Exchange,Exchange 也會透過「複製」的方式,在每一條 Queue 中都添加同樣的 message,這樣子就可以確保所有的 Consumer 都可以接收到這個 message 了!

也因為 Publish/Subscribe 模式的特性非常好用,因此通常在實作「訂閱」的情境下,就會採用 Publish/Subscribe 模式來實作。

像是你在 Facebook 上追蹤了某個粉專,只要該粉專發文,你就會收到貼文通知,這就是一種 Publish/Subscribe 的應用,即是「粉專主(Producer)」發送一個貼文給 Exchange,而「每一位粉絲(Consumer)」都可以收到這個貼文的通知。

而如果以前面提到的例子來說的話,假設今天除了「數據分析系統」想要取得訂單數據之外,其他的系統如「物流系統」、「倉管系統」也都想要取得訂單數據的話,那麼這時就可以採用 Publish/Subscribe 的方式來實作,這樣子「訂單系統(Producer)」一樣是丟出一份訂單數據給 Exchange,而「每一個想要獲得通知的微服務」就都可以從 Queue 中取得到這筆訂單數據了!

4. Routing 模式 #

Routing 模式也是一個用到 Exchange 的模式,他所使用的是 Exchange 的 direct 設定。

在 Routing 模式中,當 Producer 將 message 丟給 Exchange 時,Producer 同時要在這個 message上面添加一個 routing key,因此 Exchange 就會根據這個 routing key,將 message 丟到指定的 Queue 上(Exchange 和 Queue 之間要用什麼 routing key 綁定,需要先行設置)。

Routing 模式雖然使用上沒有 Publish/Subscribe 模式來的常用,但是他的重點在於 「可以多重綁定」,也就是同一個 routing key 可以綁到多條 Queue 上,因此就可以拿來實作收集 Log 的 Queue。

像是在下圖中,我們可以將 infoerrorwarning 這三個 routing key,綁到記錄一般 Log 的 Queue 上,然後再將 error 這個 routing key,再綁定到另一條記錄 Error Log 的 Queue 上,這樣子就可以實作出一份帶有全部 Log 的 Queue、以及一份只有 Error Log 的 Queue 了。

不過,雖然使用 Routing 模式可以很容易的實作出上述的收集 Log 的 Queue,但是因為他的重要邏輯都寫在 Exchange 上,所以如果對 RabbitMQ 或是 Exchange 不太熟練的話,就會不知道要去哪裡改這些設定(Exchange 的設定要進到 RabbitMQ 的系統中改)。

因此在實作上,建議大家是慎用這個模式,除非團隊中的每個人真的都很熟悉 RabbitMQ,不然的話用這個模式可能會導致後期維護不易。

5. Topics 模式 #

Topics 模式算是更進階的 Routing 模式,他的 Exchange 使用的是 topic 設定,不過用法基本上和 Routing 模式一樣,只是 routing key 進階成可以使用模糊綁定而已。

我自己還沒有在實務上見到過 Topics 模式的用法,所以除非大家有很特殊的需求,才需要考慮使用 Topics 模式,不然一般的情況下,使用前面的模式就可以解決大部分的問題了。

RabbitMQ 總結 #

所以總結上面的介紹的話,在 RabbitMQ 中,最常見的 5 種模式分別是:

  1. Direct 模式
  2. Worker 模式(常用)
  3. Publish/Subscribe 模式(常用)
  4. Routing 模式
  5. Topics 模式

因此大家以後就可以根據自己的需求,決定要使用哪一種模式來實作了!

結語 #

這篇文章我們先介紹了 RabbitMQ 中的三個重要角色:Producer、Consumer、Queue,並且也介紹了 RabbitMQ 中常見的五種模式,因此大家就可以根據自己的需求,決定要使用哪種模式來實作了。

如果你對 RabbitMQ 的其他文章有興趣,也可以直接點擊下列連結跳轉到該文章:

如果你對後端技術有興趣的話,也歡迎免費訂閱 《古古的後端筆記》電子報 ,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!