前期提要:如果不了解什麼是 Message Queue,可以先參考 RabbitMQ 介紹(一)- 什麼是 Message Queue? 的介紹
RabbitMQ 是在各企業中最為廣泛使用的 Message Queue,而在 RabbitMQ 的世界中,有三個重要的角色需要了解,分別是:
以下圖為例,綠色的「訂單系統」是 Producer,藍色的「數據分析系統」是 Consumer,而橘色的「Message Queue」則是 Queue。
在 RabbitMQ 的世界,Producer、Consumer、以及 Queue,是最重要的三個名詞,因此先了解這些名詞的意義,可以說是認識 RabbitMQ 的第一步。
在 RabbitMQ 中,常見的 5 種模式如下(所有模式可參考 RabbitMQ 官網 ):
Direct 是最簡單的模式,也就是只有一個 Producer 負責發送 message 到 Queue 裡,並且也只有一個 Consumer 會從 Queue 中接收 message,接著處理該 message。
像是以上面的「訂單系統」和「數據分析系統」的例子來說,他們其實就是使用最簡單的 Direct 模式,由「訂單系統」這個 Producer 負責發送 message,並且由「數據分析系統」這個 Consumer 接收 message。
Worker 模式和 Direct 模式很像,差別只在 Worker 模式「同時有多個 Consumer」一起去接收 Queue 裡面的 message,進而提升 message 消化的速率。
Worker 模式是 RabbitMQ 中滿常用的一個模式,假設今天 Queue 突然有很多 message 要處理,就可以多叫幾台 Consumer 來一起消化,因此可以輕易的達成「橫向擴展」,在實作上非常的好用!
Publish/Subscribe 模式也是 RabbitMQ 中很常用的一種模式。從這個模式之後,在 Producer 和 Queue 之間,就會多出一個叫做 「Exchange」 的角色。
所以在 Publish/Subscribe 模式中,Producer 就不會直接把 message 丟到 Queue 裡面了,Producer 反而是會先把 message 丟給 Exchange,然後再交由 Exchange 去決定要把這個 message 丟到哪個 Queue 裡面。
所以換句話說的話,就是 Producer 再也不會直接和 Queue 溝通了,而是會藉由一個中間人 Exchange 去處理這樣。
而在 Exchange 中,他有 3 種類型(type)可以選(direct
、fanout
、topic
),所以在下面不同的模式中,就會搭配不同的 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 中取得到這筆訂單數據了!
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。
像是在下圖中,我們可以將 info
、error
、warning
這三個 routing key,綁到記錄一般 Log 的 Queue 上,然後再將 error
這個 routing key,再綁定到另一條記錄 Error Log 的 Queue 上,這樣子就可以實作出一份帶有全部 Log 的 Queue、以及一份只有 Error Log 的 Queue 了。
不過,雖然使用 Routing 模式可以很容易的實作出上述的收集 Log 的 Queue,但是因為他的重要邏輯都寫在 Exchange 上,所以如果對 RabbitMQ 或是 Exchange 不太熟練的話,就會不知道要去哪裡改這些設定(Exchange 的設定要進到 RabbitMQ 的系統中改)。
因此在實作上,建議大家是慎用這個模式,除非團隊中的每個人真的都很熟悉 RabbitMQ,不然的話用這個模式可能會導致後期維護不易。
Topics 模式算是更進階的 Routing 模式,他的 Exchange 使用的是 topic
設定,不過用法基本上和 Routing 模式一樣,只是 routing key 進階成可以使用模糊綁定而已。
我自己還沒有在實務上見到過 Topics 模式的用法,所以除非大家有很特殊的需求,才需要考慮使用 Topics 模式,不然一般的情況下,使用前面的模式就可以解決大部分的問題了。
所以總結上面的介紹的話,在 RabbitMQ 中,最常見的 5 種模式分別是:
因此大家以後就可以根據自己的需求,決定要使用哪一種模式來實作了!
這篇文章我們先介紹了 RabbitMQ 中的三個重要角色:Producer、Consumer、Queue,並且也介紹了 RabbitMQ 中常見的五種模式,因此大家就可以根據自己的需求,決定要使用哪種模式來實作了。
如果你對 RabbitMQ 的其他文章有興趣,也可以直接點擊下列連結跳轉到該文章:
如果你對後端技術有興趣的話,也歡迎免費訂閱 《古古的後端筆記》電子報 ,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!