前面談過 Message Router 如何把訊息來源與訊息的最終目的地解耦。本章詳述各種具體的 Message Router 型別,說明如何為整合方案提供路由與中介能力。

多數模式是 Message Router 的細化,其他則組合多個路由器來解決更複雜的問題。因此訊息路由模式可分成三群:

  • 簡單路由器——Message Router 的變體,把訊息從一個入站通道路由到一或多個出站通道
  • 組合式路由器——組合多個簡單路由器,創造更複雜的訊息流
  • 架構模式——描述以 Message Router 為基礎的架構風格

簡單路由器#

  • Content-Based Router(內容式路由器)——檢視訊息內容,據此把它路由到另一個通道。這讓訊息生產者只要送到單一通道,由路由器負責檢視與導向;發送端因此不必承擔這件事,也不會與特定目的通道耦合
  • Message Filter(訊息過濾器)——Content-Based Router 的特殊形式。它檢視訊息內容,符合條件就傳給另一個通道,否則丟棄。搭配 Publish-Subscribe Channel 使用時,可以把訊息路由給所有可能的接收者,讓接收者自己濾掉不相關的訊息。

Message Filter 的功能與 Selective Consumer 非常相似,關鍵差異在於:Message Filter 是訊息系統的一部分,把合格訊息路由到另一個通道;Selective Consumer 則內建於 Message Endpoint 之中

預測式路由 vs. 反應式過濾#

Content-Based Router 與 Message Filter 其實能解決類似的問題:

  • Content-Based Router 依編碼在自己內部的準則,把訊息**預測式(predictive)**地路由到單一通道——掌控力完全,但相依於所有可能目的通道的清單
  • 一個 Publish-Subscribe Channel 加上一組 Message Filter(每個潛在接收者各一個)也能達成等價行為——反應式(reactive)過濾把路由邏輯分散到許多過濾器上,避免了一個相依於所有目的地的中央元件

其餘簡單路由器:

  • Dynamic Router(動態路由器)——基本的 Message Router 用固定規則決定目的地;需要更多彈性時,動態路由器允許透過送控制訊息到指定的控制埠來修改路由邏輯。這種動態特性可以與多數形式的 Message Router 結合。
  • Recipient List(收件者清單)——有時你需要把訊息送給多個接收者,卻仍想掌控接收者是誰。本質上它是一個能把單一訊息路由到多個目的通道的 Content-Based Router
  • Splitter(分割器)——有些訊息含有多個項目的清單,用它把大訊息拆成一則則個別訊息,每則再各自路由與處理。
  • Aggregator(聚合器)——把 Splitter 產生的訊息重新組合回單一訊息。它能接收一串訊息、辨識相關訊息並合併成一則。

與其他路由模式不同,Aggregator 是有狀態的 Message Router——它必須把訊息存在內部,直到特定條件被滿足。這意味著它可能消費數則訊息之後才發布一則

  • Resequencer(重排序器)——因為我們用訊息連接跑在多台電腦上的應用程式或元件,多則訊息可能被並行處理;某個行程比另一個快,就會造成訊息亂序。但有些元件(例如以分類帳為基礎的系統)依賴正確的訊息順序,Resequencer 就把亂序訊息放回順序中。

Resequencer 同樣是有狀態的——它可能需要把數則訊息存在內部,直到補齊序列的那則訊息到達。但與 Aggregator 不同,它最終發布的訊息數量與它消費的相同

各變體的性質對照#

模式消費訊息數發布訊息數有狀態?備註
Content-Based Router11否(多數情況)
Message Filter10 或 1否(多數情況)
Recipient List1多個(含 0)
Splitter1多個
Aggregator多個1
Resequencer多個多個發布數量與消費數量相同

表中未把 Dynamic Router 列為獨立選項,因為任何路由器都能實作成動態變體

組合式路由器#

Pipes and Filters 架構的關鍵優勢,是我們能把多個過濾器組合成更大的方案。

  • Composed Message Processor(組合式訊息處理器)Scatter-Gather(散佈收集) 都組合多個 Message Router 變體,來建構更完整的方案:兩者都能從多個來源取得資訊、再重組成單一訊息。差別在於——Composed Message Processor 保有對「可能來源」的掌控,Scatter-Gather 則用 Publish-Subscribe Channel,讓任何有興趣的元件都能參與

這兩者管理的是訊息的平行路由:把單一訊息同時送給多個參與者,再把回覆重組成一則。另有兩個模式管理循序路由——讓訊息依序經過一連串步驟:

  • Routing Slip(路由單)——想從中央一點控制訊息的路徑時使用。它就像貼在辦公文件上的傳閱單,讓文件依序經過一串收件人。
  • Process Manager(流程管理器)——彈性更大,但要求訊息在每個功能之後都回到一個中央元件

架構模式#

Message Router 讓我們能以一個中央的 Message Broker(訊息代理) 來架構整合方案。相對於前述各種設計模式,這個模式描述的是一種輻輳式(hub-and-spoke)架構風格