脈絡:Point-to-Point Channel 常被用來承載 Document Message,因為它確保恰好一個消費者會消費每則訊息。但為了測試、監控或排查問題,能檢視通道上流動的所有訊息可能很有價值

幾條走不通的路#

再加一個監聽者#

讓寄件端或收件端多發布一份到檢視用的通道#

這會迫使我們修改可能為數龐大的元件;而且若面對的是套裝應用,我們甚至改不了。

把通道改成 Publish-Subscribe Channel#

這確實能讓額外的監聽者在不擾動訊息流的情況下檢視訊息。

而且即使通道上只有單一個消費者,發布訂閱通道也可能比點對點通道更沒效率或更不可靠。

用 peek 方法#

許多訊息系統提供 peek 方法,讓元件在不消費訊息的情況下檢視點對點通道中的訊息。

在通道中插入一個攔截元件#

插入一個「攔截器」形式的元件:從進站通道消費訊息、檢視它,再把未修改的訊息傳到輸出通道。

解法#

Wire Tap 是一個帶兩個輸出通道的固定 Recipient List:它從輸入通道消費訊息,把未修改的訊息發布到兩個輸出通道

要把它插進某個通道,你得建立一個額外通道,並把目的地接收端改成從第二個通道消費

因為分析邏輯位於第二個元件裡,我們可以把一個通用的 Wire Tap 插進任何通道,完全沒有改變主通道行為的危險——這提升了重用性,也降低了替既有方案加裝監測的風險。

圖 11-4:Wire Tap 解法示意

代價與注意事項#

Wire Tap 的主要缺點是**「消費並重新發布訊息」所帶來的額外延遲**。許多整合工具套件即使訊息未經修改就發布到另一個通道,也會自動把訊息解碼;而且新訊息會拿到新的 message ID 與新的時間戳——這些操作累加起來就是可觀的開銷。

儘管主通道與次要通道收到的是相同的訊息,多數訊息系統會自動為系統中的每則訊息指派新的 message ID——這意味著原始訊息與那則「副本」有不同的 message ID

範例:用多個 Wire Tap 測量訊息運行時間

圖 11-5:用一對 Wire Tap 分析訊息運行時間

Wire Tap 的強項之一,是我們能組合多個 Wire Tap,把訊息的副本送到一個中央元件做分析

那個元件可以是 Message Store,也可以是另一個分析訊息之間關係的元件——例如兩則相關訊息之間的時間間隔