l

2016年11月22日 星期二

軟體架構模式(2):Pipes and Filters

Nov. 22 16:16~18:05

擷取

▲圖片節錄自《POSA 1》

 

今天繼續介紹《POSA 1》書中另一個很常用的架構模式:Pipes and Filters(管線與過濾器)

Pipes and Filters

Pipes and Filters提供一個處理資料流(data stream)的架構,每一個處裡步驟被封裝在filter元件中,資料則是透過pipe在兩個相鄰的filter之間傳遞。透過重組filter可以建構出不同功能的系統。

Context:你所設計個系統需要處理或轉換一個輸入資料流。

Prooblem:如何分解一個系統?

Forces

  • 開發人員或終端使用者可以藉由交換或重組處裡步驟來增強系統功能。
  • 小的處裡元件比起大的處裡元件更容易在不同的情境(context)中被重複使用。
  • 不相連的處裡步驟不需要共享資訊。
  • 存在不同的輸入資料來元,例如網路連線、硬體感應器傳回的資料。
  • 最終的處裡結果可以採用多種方式來表現或儲存。
  • 如果讓使用者自行用檔案儲存處理過程的中間結果以便做更進一步的處理,很可能產生雜亂的目錄且很容易出錯。
  • 可能會採用平行處理的方式來處理資料。

Solution:將系統切割成數個循序的處理步驟稱為filter,並透過稱為pipe的資料流將這些步驟串接起來。一個filter的輸出資料成為下一個filter的輸入資料。Filter並非一次處理完全部的輸入資料再一口氣將其輸入,而是採用增量方式處理與產生資料以降低延遲與支援平行處理。系統的輸入稱為data source,例如文字檔案、網路連線串流影音資料,系統的輸出資料流至data sink,例如檔案、終端機、動畫程式、影片播放軟體。Data source、filter、data sink透過pipe循序地連接在一起,每一個pipe實作連接相鄰兩個filter的資料流。Filter與pipe的串接順序稱為processing pipeline(處理管線)。

Resulting Context

  • 不需中間檔案,但有需要時可以透過「T型接頭(T-junction)」產生中間檔案以供檢查之用。
  • 相同功能不同實作的filter彼此可以有彈性的替換。
  • 透過重組filter可以產生不同的processing pipeline達到不同的處理功能。
  • 可重複使用filter。
  • 可以藉由重組filter快速產生資料處理系統的雛形,之後再逐步優化系統。
  • 可以透過平行處理來增加效能。
  • 共享狀態的代價較高或不靈活。如果多個處理階段需要共享大量的全域資料,套用Piples and Filters幫不上什麼忙或是無法提供該模式的全部優點。
  • 平行處理所獲得的效率有時候會是一種幻覺(眼睛業障重)。很多原因會減低平行處理所帶來的效率提升,例如在filter之間傳輸資料的成本、有些filter可能把所有輸入資料全部處理完之後才一口氣產生輸出、thread之間的context-switching成本、filter之間透過pipe同步資料的成本等。
  • 為了提供最高的彈性,Pipes and Filters採用單一資料結構做為所有filter的輸入與輸出,但付出的代價就是filter可能需要付出資料轉換的成本。例如假設所有傳輸資料都使用字串格式,某個處理數字的filter需要先將輸入字串轉成數字型態,處理完畢之後再轉換成字串型態輸出。
  • 錯誤處理是Piples and Filters架構的痛點,至少必須規範一個共同的錯誤回報策略並且在整個系統中都使用它。具體的錯誤回復與錯誤處理策略相依於processing pipeline所要解決的問題,因為Piples and Filters提供彈性的processing pipeline組合方式,所以具體的錯誤處理也變得更加困難。

Known Uses:UNIX系統、影音播放軟體的編碼器與解碼器、Microservice架構。

***

友藏內心獨白:Piples and Filters符合單一責任原則。

沒有留言:

張貼留言