這是一本談**企業整合(enterprise integration)的書,而且是用訊息傳遞(messaging)**來做整合。它不是任何特定產品或技術的說明書,而是寫給那些正在使用各種訊息中介軟體的開發者與整合人員:

  • 各家廠商的**訊息導向中介軟體(message-oriented middleware, MOM)**與整合套件,如 IBM(WebSphere MQ Family)、Microsoft(BizTalk)、TIBCO、WebMethods、SeeBeyond、Vitria
  • 內建於商業與開源 J2EE 應用伺服器、或以獨立產品形式存在的 Java Message Service(JMS) 實作
  • Microsoft 的 Message Queuing(MSMQ),可透過多種 API 存取,包含 .NET 的 System.Messaging 函式庫
  • 支援非同步 Web service 的新興標準(例如 WS-ReliableMessaging)以及相關 API,如 Sun 的 JAXM、Microsoft 的 Web Services Extensions(WSE)

整合不等於分散式應用#

企業整合的範疇超出「把一個應用程式做成 n 層分散式架構」。分散式應用中的某一層無法獨立運作;而被整合的應用程式各自都是能單獨運行的獨立程式,只是以鬆散耦合(loose coupling)的方式互相協調。

訊息傳遞讓資料或命令能以「送出後就不管(send and forget)」的方式跨網路傳送:呼叫端送出資訊後就繼續做別的事,實際傳輸交給訊息系統在背景完成;需要時再透過回呼(callback)取得結果。

非同步的呼叫與回呼會讓設計比同步作法複雜,但換來的是可重試直到成功——通訊因此可靠得多,並額外帶來請求節流(throttling)與負載平衡等好處。

誰該讀這本書#

本書要幫助的是「用訊息中介軟體把應用程式接起來」的人:

  • 應用架構師與開發者——你在用 J2EE 或 .NET 這類現代企業應用平台開發複雜系統,而系統必須與其他系統整合。本書談的是整合應用程式,不是建構應用程式(後者請看 Martin Fowler 的《Patterns of Enterprise Application Architecture》)。
  • 整合架構師與開發者——你在用 IBM WebSphere MQ、TIBCO、WebMethods、SeeBeyond、Vitria 等商業整合工具串接套裝或自製系統。這些工具多半已內建本書的模式;本書幫你理解底層概念,並以與廠商無關的詞彙做出有把握的設計決策。
  • 企業架構師——你需要維持全公司軟硬體資產的「大局觀」。本書提供一套一致的語言來描述橫跨多種技術的大型整合方案,也讓你與各層級架構師、開發者之間的溝通更有效率。

你會學到什麼#

本書不打算論證「企業整合有沒有商業價值」,焦點放在怎麼把它做出來

  • 訊息傳遞相較於其他整合技術的優勢與限制
  • 如何決定應用程式需要哪些訊息通道、如何控制是否允許多個消費者收到同一則訊息、以及如何處理無效訊息
  • 何時該送訊息、訊息裡該放什麼、如何運用特殊的訊息屬性
  • 當寄件端不知道最終目的地時,如何把訊息路由過去
  • 當收發雙方對格式沒有共識時,如何轉換訊息
  • 如何設計把應用程式接上訊息系統的那段程式碼
  • 系統上線後如何管理與監控

即使你已熟悉這些做法,把它們寫成文件、取好名字本身就有價值——它讓你能有效率地與同事討論設計。

本書不涵蓋什麼#

書名冠上「enterprise」的書通常落入三類:涵蓋整個領域但無法給出實作細節;給出具體實作指引但必須限縮範圍;或兩者都想要,於是永遠寫不完、或出版時已經過時。

本書選擇第二條路。因此以下主題雖然重要,仍被排除在外:安全性、複雜資料對應、工作流程、規則引擎、可擴展性與強健性、分散式交易處理(XA、Tuxedo 等)。之所以以非同步訊息傳遞為主軸,是因為它充滿有趣的設計議題與取捨,而且能從各家廠商紛雜的實作中抽象出乾淨的模型。

本書也不是任何特定訊息或中介軟體技術的教學。書中會出現 JMS、MSMQ、TIBCO、BizTalk、XSL 等範例,但那些只是為了示範「模式如何落地成實作」。

本書如何組織#

本書核心是 65 個模式所構成的一套模式語言(pattern language)

  • 每個模式代表讀者必須做的一個決策,說明影響決策的各種考量,並給出公認的解法。
  • 模式語言是模式彼此交織成的網——每個模式會引出下一個,帶著讀者走完整個決策過程。
  • 這是把專家知識文件化、讓非專家也能理解並運用的有力手法。

模式與模式語言的概念最早由 Christopher Alexander 應用於城市與建築設計(《A Pattern Language》、《A Timeless Way of Building》),後經《Design Patterns》、《Pattern Oriented Software Architecture》、《Core J2EE Patterns》、《Patterns of Enterprise Application Architecture》等書帶進軟體領域。

模式語言教的不是「一個問題的一個答案」,而是在一個有邊界的問題空間裡解無數種問題。因為每次要解的整體問題都不同,走過模式的路徑也每次都不同。

即使你已是訊息整合的老手,這本書仍有價值:它能驗證你辛苦換來的理解、成為你把知識傳給資淺同事的參考、補上你可能沒注意到的細節與模式間的關聯,而模式名稱本身就是一套與同儕討論設計選項的共同詞彙。

延伸:致謝與封面故事

致謝#

寫作構想可追溯到 2001 年夏天,當時 Martin Fowler 正在寫《Patterns of Enterprise Application Architecture》。Kyle Brown 注意到該書談了很多「如何建構應用程式」,卻只略微觸及「如何整合它們」。這個念頭促成 Martin 與 Kyle 一系列的會面,Rachel Reinitz 與 John Crupi 也加入;Bobby 於 2001 年秋天、Gregor 於 2002 年初先後加入討論。

隔年夏天,這群人向 PLoP(Pattern Languages of Programs)研討會投了兩篇論文——一篇由 Bobby 與 Kyle 合著,另一篇由 Gregor 撰寫。會後 Kyle 與 Martin 回到各自的書,Gregor 與 Bobby 則把兩篇論文合併,成為本書的基礎。同時 www.enterpriseintegrationpatterns.com 上線,讓全球的整合架構師與開發者參與內容演進。從 Kyle 最初的念頭到定稿交付出版社,約歷時兩年。

封面圖片#

Martin Fowler Signature Series 的共同主題是——對一本談整合的書來說,再貼切不過。千百年來,橋一直在連接分處兩岸、兩山或馬路兩側的人們。

封面選用日本大阪住吉大社的太鼓橋(Taiko-bashi),取其簡潔優雅。住吉大社供奉航海守護神,原本就建在水邊;有趣的是,填海造陸把水推遠了,如今神社已距海岸近三英里。每年新年約有三百萬人造訪此地。

延伸:兩篇推薦序的要旨

John Crupi(《Core J2EE Patterns》共同作者)——學會一項技術只是第一步,真正的目標是學會有效地運用它。市面上教你「怎麼把 Java 或 C# 寫得更有效率」的好書很多,教你「怎麼有效地設計」的卻少得多,而這正是本書切入的地方。他認為本書收錄了設計 Web service 與其他整合系統所需的多數模式;等規格塵埃落定成為標準之後,這些模式的價值才會真正兌現。

Martin Fowler——他在寫《Patterns of Enterprise Application Architecture》時,與 Kyle Brown、Rachel Reinitz 的討論中意識到自己書中有一個重要缺口:非同步訊息系統。應用程式無法彼此孤立而活,我們需要能把「當初根本沒打算互通」的系統接起來的技術;在各種宣稱能解整合難題的技術中,訊息傳遞最有希望。他沒有篇幅、精力與知識好好處理這個主題,於是找了 Gregor 與 Bobby 來完成——結果就是這本書。