作者:Martin Fowler
脈絡:一家企業有多套獨立建造的應用程式,使用不同的語言與平台。
為什麼企業註定有一堆異質系統#
在理想世界裡,一個組織會運行在單一一套內聚的軟體上,從一開始就設計成統一而一致地運作。當然,即使最小的營運單位也不是這樣。多套軟體各自處理企業的不同面向,理由包括:
- 人們會買外部組織開發的套裝軟體
- 不同系統建於不同時期,導致不同的技術選擇
- 不同系統由不同的人建造,各自的經驗與偏好帶出不同的建構方式
- 把應用程式交付出去、產生價值,比確保整合被妥善處理更重要——尤其當整合對當下正在開發的應用程式並不增添價值時
結果是:任何組織都得煩惱如何在差異極大的應用程式之間共享資訊。它們可能用不同語言寫成、基於不同平台,甚至對「生意怎麼運作」抱著不同的假設。
要把這樣的應用程式綁在一起,需要在業務層面與技術層面都懂得如何串接。想搞得定,你就必須把「需要知道每個應用程式如何運作」的份量降到最低。
我們需要的是一種共同的資料傳輸機制:能被各種語言與平台使用、對每一方又都自然;所需的專用軟硬體極少,盡量利用企業已有的東西。
檔案是通用的儲存機制——內建於任何企業級作業系統,任何企業級語言都能存取。最簡單的作法,就是設法用檔案來整合應用程式。
解法#
該用什麼格式#
檔案的一個重要決策是格式。一個應用程式的輸出極少恰好就是另一個所需要的,所以中間總得做不少加工;而且不只所有使用該檔的應用程式得讀得懂它,你還得能對它套用處理工具。
於是標準檔案格式逐漸成形:
- 主機系統常用基於 COBOL 檔案系統格式的資料饋送
- Unix 系統用文字檔
- 現代的流行是 XML
每一種格式周邊都長出了一整個由讀取器、寫入器與轉換工具構成的產業。
該多久產出一次#
另一個議題是何時產出與消費檔案。由於產出與處理檔案都需要一定的工夫,通常你不會想太頻繁地操作它們。典型上會有某個固定的業務週期在驅動這個決定:每晚、每週、每季……應用程式習慣了新檔案何時就緒,就在那個時間處理它。
檔案傳輸的最大優點:解耦#
檔案傳輸的巨大優勢在於:整合人員完全不需要知道應用程式的內部。
檔案通常由應用團隊自己提供,內容與格式則與整合人員協商(若用的是套裝軟體,選擇往往有限)。整合人員接手處理其他應用程式所需的轉換,或者乾脆把「要怎麼操作與讀取這個檔案」留給消費端自己決定。
結果是各應用程式被相當漂亮地解耦:只要仍以相同格式產出相同資料,每個應用程式都能自由地做內部修改而不影響他人——檔案實際上成了各應用程式的介面。
代價:所有雜事都得自己做#
讓檔案傳輸簡單的部分原因,正是它不需要額外工具或整合套件——但這也意味著開發者得自己扛下大量工作:
- 應用程式之間必須約定檔名慣例與檔案所在的目錄
- 寫檔的一方必須實作某種策略來保持檔名唯一
- 各方必須約定由誰刪除舊檔,而那一方得知道檔案何時算舊、何時不再需要
- 必須實作鎖定機制或遵守時序慣例,確保不會有人在別人還在寫的時候讀檔
- 若各應用程式無法存取同一顆磁碟,就得有人負責把檔案從一顆磁碟搬到另一顆
最明顯的問題:資料過期#
檔案傳輸最明顯的問題是更新頻率低,導致系統之間失去同步。客戶管理系統可以在每晚處理地址變更並產出萃取檔,但帳務系統可能在同一天把帳單寄到舊地址。
有時候不同步不算大事——即使有電腦,人們也預期資訊流轉本來就有一定的時間差。但有時候用到陳舊資訊的後果是災難性的。決定產檔時機時,必須把消費端對新鮮度的需求納入考量。
陳舊資料最大的麻煩往往落在軟體開發人員自己身上——他們得跟不太正確的資料共處,而這會導致難以化解的不一致。
假設某位客戶在同一天於兩套系統各改了一次地址,其中一套打錯了街名,你就有了兩份彼此矛盾的地址,還得想辦法決定哪份為準。檔案傳輸的間隔愈長,這個問題愈可能發生,也愈痛苦。
產得更頻繁,就變成訊息傳遞了#
當然,沒有人規定你不能更頻繁地產出檔案。事實上,你可以把訊息傳遞想成「應用程式每發生一次變更就產出一個檔案」的檔案傳輸。
問題會轉移到「如何管理產出的大量檔案、確保它們都被讀取且沒有遺失」。這超出了檔案系統作法能處理的範圍——尤其處理一個檔案有昂貴的資源成本,若想快速產出大量檔案,成本會高到無法承受。
因此,一旦細到這種程度,把它們當成訊息來思考會更容易。
接下來#
- 想讓資料更快可得、並強制執行約定好的資料格式 → 共享資料庫
- 想整合的是功能而不只是資料 → 遠端程序呼叫
- 想頻繁交換小量資料(也許還用來喚起遠端功能)→ 訊息傳遞