訊息代理(二),Message Queue vs Pub-Sub Pattern

上一篇提到訊息代理 Message Broker 的基本用途,而這篇我們進一步來看看 Message Broker 兩種不同的 Pattern。

在討論系統設計時,我們時常會聊到 Message Queue,我最初分不太清楚 Message Queue 和 Message Broker 有什麼差別,也不太懂一種叫做 Pub-Sub 的行爲和 Queue 是否有關聯。

更甚者,我還聽過類似 Pub-Sub 的名詞:Producer-Consumer,當時這又讓我更困惑了,究竟他們有什麼不同?因此,今天就來釐清這些不同的概念和名詞吧!

什麼是 Message Queue、Producer 及 Consumer?

所謂的 Message Queue,中文翻譯成訊息佇列,可以理解成訊息代理(Message Broker)的一種,其目的依然是接收、暫存、發送資訊

而 Message Queue 顧名思義就是讓訊息排隊的一個空間,發送方將訊息不斷丟入 Queue 中,接收方則依序拿取訊息。

Message Queue

我們一般將把訊息放入 Queue 中的發送方稱作 Producer,因為他提供了資料;而接收方則被稱作 Consumer,因為他把資料取出來,將其消耗掉了。也就是說就算我們有多個 Consumers 對一個 Queue 取出資料,也不會拿到同一筆重複的內容。

將任務放入 Message Queue 就是一個常見的情境,我們可能會有多個 Workers 來處理任務,但是只要大家都和 Message Queue 獲取下一個該做的任務,就能避免不同 Worker 做同一個任務的情況發生。

同一筆訊息不會被重複取得

Producer 提供一筆資料後,只被一個 Consumer 所接收的通訊模式,又被稱作「點對點模式」(Point-to-Point Pattern)。

什麼是 Pub-Sub Pattern?

而另一種模式:Pub-Sub Pattern 全稱為 Publish-Subscribe Pattern,中文翻譯為「發布/訂閱模式」,功能依然符合接收、暫存、發送資訊,因此也可以實作在訊息代理(Message Broker)下。

在此模式下的發送者和接收者通常被稱作 Publisher 及 Subscriber,和點對點模式中的 Producer-Consumer 最大的差異就是當接收者 A 收到資料時,不會影響接收者 B 的接收,因此接收方才會被稱作訂閱者(Subscriber)。就像是當我訂閱了報紙時,不會因為今天的報紙被我收到了,其他訂閱者就看不到同一天的報紙了。

Pub-Sub Pattern

在 Pub-Sub Pattern 下的訊息傳輸,就有點像是「廣播」,所有的訂閱者會收到一樣的訊息。

但值得注意的是,這不代表廣播時,當下沒聽到廣播的訂閱者晚一點就聽不到了。例如有歷史記錄的聊天室就是典型的 Pub-Sub Pattern,每個使用者都會收到別人發的新訊息,但是當我下線的時候,Message Broker 依然能幫我保留這些我沒收到的新訊息,等我下次上線時再讓我一筆一筆取得。

Message Queue vs Pub-Sub Pattern

為什麼我最初在聽到 Message Queue 時,會搞不清楚他和 Pub-Sub Pattern 的差異呢?

因為 Pub-Sub Pattern 雖然沒有一個叫做 Queue 的名詞,但是在「邏輯上」幫所有訂閱者也建立了一條屬於自己的 Queue。

邏輯上,Message Broker 為每個訂閱者維護了一條 Queue

當新訊息產生時,每個人的 Queue 就會被塞入這筆訊息,但只有當訂閱者有能力接收及處理時,才會從自己 Queue 中取出他。所以收到哪一筆訊息、何時收到,會依據各自的狀態和處理能力而有所不同。

例如,圖中用戶 B 已經處理了兩筆訊息,而用戶 A 只處理了一筆,用戶 C 則因為下線,甚至沒有收到任何訊息。

之所以容易搞混,是因為無論 Message Queue 或是 Pub-Sub Pattern 都能涉及到 Queue 的概念。其實只要記住兩者最大的差異即可:Message Queue 採用 Point-to-Point Pattern,每筆訊息只會被單一消費者取用;而 Pub-Sub Pattern 則會將每筆訊息發送給所有訂閱者。

參考資料

  1. Wiki - Publish-subscribe pattern