脈絡:Wire Tap 很適合用來檢視通道上的訊息。但有時候我們需要的不只是檢視,而是修改或重新路由訊息。
為什麼需要開關#
對元件之間流動的訊息做驗證,是很有用的除錯工具。
例如測試系統時,我們想讓訊息通過額外的驗證步驟;正式環境跳過這些步驟則能改善效能。這可以類比成程式碼中的 assert 敘述——在 debug 組態中執行,在 release 組態中不執行。
同樣地,排查問題時把訊息路由過額外的記錄或監控步驟也很有用;能把這些記錄步驟開開關關,讓我們在正常情況下把訊息吞吐量最大化。
解法#
Detour 使用一個帶兩個輸出通道的簡單情境式路由器:
- 一個輸出通道把未修改的訊息傳給原本的目的地
- 當 Control Bus 下令時,Detour 把訊息路由到另一個通道——那個通道把訊息送給能檢視和/或修改它的額外元件,最終那些元件再把訊息路由到同一個目的地

圖 11-3:Detour 解法示意
實作上的考量#
但這個作法假設繞道路徑上的元件能被修改,以納入受 Control Bus 控制的旁路邏輯。