前面談過 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 Router | 1 | 1 | 否(多數情況) | |
| Message Filter | 1 | 0 或 1 | 否(多數情況) | |
| Recipient List | 1 | 多個(含 0) | 否 | |
| Splitter | 1 | 多個 | 否 | |
| 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)架構風格。