程式碼高𠅙

顯示具有 SOA 標籤的文章。 顯示所有文章
顯示具有 SOA 標籤的文章。 顯示所有文章

2012/12/28

ETL 與 ESB 之異同與整合應用

因為自己開發 ETL 相關產品,加上之前對 ESB 與 SOA 也有接觸,那就來聊聊這兩個東西有什麼關連吧!

ETL 全名是 Extract, Transform, Load, 是指資料搬移過程中,從來源資料庫擷取 (Extract)、經過資料轉換 (Transform),再載入 (Load) 到目標資料庫的過程。通常會用商業智慧資料分析的資料準備階段,資料從前端的交易性資料庫,透過 ETL 軟體導到資料倉儲,再交給 OLAP、報表或資料探勘工具做進一步分析。

而 ESB 全名是 Enterprise service bus,這是一種企業應用程式的中間層軟體,可以讓不同的應用程式系統,透過 ESB 所提供的開放式介面,彼此介接,達成訊息與應用整合的目標。ESB 是 SOA 服務導向架構在企業部署應用中,比較容易上手的解決方案。打個廣告,個人在 2006 年曾為 ITHome 撰寫的三篇 SOA 專欄文章:

雖然已經有點過時,不過裡面所談到的 ESB 跟 SOA 的觀念,還是具有參考價值。我再找個時間來更新這部分的資料好了! 

好了,談到這裡,那 ETL 與 ESB 有任何關係嗎? 也許有些人會覺得我是不是聯想力太豐富了,才會覺得這兩者有關。嘿! 它們還真的有點關係呢!

前面所說,ESB 是一種企業應用程式的中間層軟體,用來整合應用,或交換訊息。而事實上,我們也可以把 ETL 看成是另一種中介軟體,但它所介接的兩端,不是應用系統,而是資料來源與目的端。這裡我用中介軟體,而沒講它是 Middleware, 是因 Middleware 有比較嚴謹的定義。可是實際上,如果從 Middleware 定義:"Middleware makes it easier for software developers to perform communication and input/output, so they can focus on the specific purpose of their application." 來講,ETL 軟體也的確具有這樣的功能。

也就是說,基本上各種中間層軟體,都具有能讓介接兩端的系統,透過中間層軟體介面,達到彼此間獨立演進,又能統合在一起,彼此協作。ESB 是這樣的系統,ETL 其實也有這樣的特色。

再來談談不同的部分。首先,ETL 通常具有主動性,透過排程,去資料來源抓取資料。但 ESB 通常是被動的,等待應用程式呼叫,才進行訊息的傳輸與 routing. 不過這一點並不絕對,現在的 ETL, 有些也採取 Event Trigger 的方式來設計。例如,當檔案內容發生改變時,觸發 ETL 作業過程。這種作業方式跟 MOM (Message-oriented middleware) 在收到訊息時進行資料傳輸的行為模式很類似。

第二點,ETL 所傳輸的資料,通常包含多筆記錄,是屬於 table 或 collection based 的方式在傳輸資料。而 ESB 所傳輸的資料,通常是一個 remote procedure call 或是一個訊息等;是屬於 message 或 document based 的。這點也沒有絕對,因為 ETL 事實上也可以只傳一筆資料,而 ESB 事實上也可以一次傳輸多筆資料。不過就效能上來講,當然 ETL 在傳輸大是資料時,速度應該會較快。這跟架構有關,就先點到為止。

第三點,是關於服務執行一次轉換或呼叫的時間,英文可稱為 session 吧。通常 ETL 因為一次會傳輸與轉換的量資料,所以執行一次轉換的時間會較久。而 ESB 單一訊息通常資料量不大,因此呼叫時間較短。

最後則是呼叫或資料傳輸的方式,因為傳統上與 ETL 介接的都是資料庫系統,資料被取出之後,來源資料庫並不會等整個 ETL 過程結束等待回應,再去進行什麼操作。但 ESB 視其中介的性質,可能有不同的呼叫或等待回應方式,例如 SCA 裡面就定義了底下幾種方式:
  • Request response interaction
  • One-way interaction
  • Conversational interaction
  • Callback interaction 
這些應用系統與 ESB 中間層軟件之間豐富的互動性,是傳統 ETL 軟件較缺乏的 (不過傳統上兩者用途本就不同)。


前一陣去一某家公司拜訪,他們要導入某大廠的 ESB 系統,做跨事業部門的系統整合。除了各獨立的應用程式要能整合應用外,另一個需求就是以前不同事業單位,分散在各地的區域性資料庫,之後要能進行資料匯整,放到一個中央控管的整合資料庫。這時,若能在規劃中,加入 ETL 的應用,必然會使整個系統的開發更為順利。

以上情境,當然 ESB 與 ETL 是可以分別採用不同的系統。不過筆者在想的是,住後以雲端為主的應用時代來臨,這兩者都必須要能朝雲端架構演進,甚至統整成為同一個系統,因為以後的應用情境很有很可是前端資料讀取的介面,採用 ESB 的訊息接收模式,而後端則採用 ETL 直接將訊息進行拆解,轉化,載入到 data warehouse 或 hadoop 分析平台之中。因此這兩種應用若能更密切的整合,系統開發跟維護心力就可大幅降低。

而甚至資料傳輸樣式也超出傳統 ETL 或 ESB 的 message 或 collection based 的方式,而是如新一代的,streaming based 的資料串流,資料從不間斷的產生,永不止息(如 twitter)。如果有一套系統,只要透過組態或圖形化介面方式,就能設計出足以處理這種新的訊息型態的資料流程,那無異是即時訊息處理上的一把神兵利器。且讓我們拭目以待吧!



2006/08/23

Doing Ajax the SCA Way

興趣盎然的閱讀著 tempo 所作的投影片「AJAX 的 client/server 溝通機制探究」,裡面提到了「如果你流落荒島, 但是只能帶一個 AJAX Framework, 建議你帶 DWR」。這句話引起我對 DWR 極大的興趣。
其 實我們公司內部已經採用 Echo2 開發產品 (而且用的很高興)。Echo2 最大的優點是可讓我們完全擺脫 HTML、Javascript 編輯時擾人的細節,完 完全全以乾淨的 Java 程式碼開發出極為動態的 Ajax 應用程式,但相對的它的缺點是會耗費大量的 Session 資源。因此如果想要開發 Community Style 的網站時,就不適合採用 Echo2 了。所以一直以來,我對較為傾向於 stateless, 單純 RPC 導向的 ajax framework 還是保持一定的注意。
看著 DWR 的範例程式碼,讓我有種似曾相識的感覺。我突然回想起,先前在 JavaTwo 中我所介紹的 Tuscany SCA 也有提供 Ajax Remoting 的功能。再回頭去翻翻 Tuscany SCA 所提供的 ajax client 端範例程式碼,嗯!它的風格一樣也是簡潔明瞭。

以 Tuscany 設計 Ajax 的 Server 端服務
直接以 Tuscany 的範例做說明,假設我們在 Server 端有個類別如下:
public interface HelloWorldService {
    public String getGreetings(String name);
}

@Service(HelloWorldService.class)
public class HelloWorldServiceComponentImpl implements HelloWorldService {
    public String getGreetings(String name) {
        return "jsonrpcHello " + name;
    }
}

為了要讓這個類別變成 Client 端 JSON-RPC 可以呼叫的服務,我們在 sca.module 中定義其 entryPoint 及 component wire:



   
       
       
        HelloWorldServiceComponent/HelloWorldService
   


   
       
   

  

在 Client 端使用 Ajax 服務

最後,我們在 client 端就可以使用 Tuscany 所提供的 "SCA 物件",簡單的使用 server 上的服務操作:

:

:

:

:

嗯嗯... 這裡似乎隱約就可嗅到 SCA 所強調的 unified programming model。即使使用 javascript 來呼叫 service,它的用法幾乎與標準的 Java client 沒有多大差異。

在 Ajax client 呼叫 Web Services
另 外,SCA 還有一項特長,就是可以「把別人家的 Web Services 包裝起來變成自家的元件」。這在 Ajax 手法下特別有用,因為受限於 security issues,Ajax 無法由 client 端向不同的網站發出 ajax request。透過 SCA「把別人家的 Web Services 包裝起來變成自家的元件」的特長,我們可以在 sca.module 中集成不同網站的 web services,然後用 entryPoint 匯出成可在 client 端以 JSON-RPC 呼叫的服務。 有興趣的朋友,可以參考 Tuscany 所附的 scahelloworldjsclient 範例。

一點提醒

到這裡,有朋友心動,想用 SCA 來寫 Ajax 了嗎?哎~~ 還是提醒心動的朋友,出了事情要想辦法自己解決,因為網路上很少人談到這樣的作法。而且肯定的,至少在目前為止,在網頁元素的 binding 上,SCA 所提供的支援應該較為單調。至少我還不知道,是否有內建的 function call,只要一個指令,就可以把 service 傳回 string array binding 到 html 的 select 元素上。當然自己寫也不會太難就是了!

一個問題
最後,有一個問題我納悶很久了,很想問問 tempo:既然流落荒島,那為什麼還要帶一本 Ajax 的書呢?那時候我可能會帶「與食人族共舞」或「24 小時學會獨木舟造船術」。嗯…「螃蟹的 24 種吃法」也不錯,如果有的話。

2006/08/22

從 Separation of Concerns 談 AOP 與 SOA

AOP (Aspect-oriented Programming) 強調的是面向分割 (separation of concern),並且試圖由程式語言 (compiler)、框架 (framework) 或執行期 (runtime) 層次對橫切物件功能的服務考量 (crosscutting concerns) 提供支援。

AOP 本身是開發應用程式框架的有力工具,透過 AOP 的手法,可以輕易解決傳統 OOP 窒礙難行的問題。例如充斥在整個系統中的橫切服務--包括日誌、交易、安全的議題,都可透過 AOP 的支援而輕易實作出來。

不過 AOP 也引入一些問題,例如透過 AOP 手法建築的系統,其元件間的互動關係較難以理解及追蹤,因此個人認為 AOP 適用於開發 application framework 的底層,但卻並不適合拿它直接來開發應用系統。

 而個人對於 SOA 所謂的 Concerns 則有二種看法:
  • Business Concerns: 如何達到 (business) services independency
  • 如 同 AOP 中之 crosscutting concern:這在 SOA 中給它負予了一個可怖的稱謂,叫 Enterprise Concerns,其實也不過就是 log, monitor, access rights 這些非使用者功能導向的服務需求。不過 SOA 不在程式語言、編譯器或框架(framework)上解決此議題,而在架構層級解決
SOA 之所以也能達到 separation of concerns 的訴求,完全是因為它將服務的兩端抽象化,並將呼叫訊息化。在 client 與 service 之間,可以加入許多的 proxy, router, interceptor 這樣的東東,因此可以在兩造之間加入許多的 QoS(Quality of Services, 即上述的 Enterprise Concerns)。

這樣一來,這些 QoS 就可獨立出來個別設計,再於佈署時期或執行時期動態的設定,也就達到 separation of concerns 的訴求。從這個面向來說,SOA 達到了最為動態的 AOP。不過,相對的 SOA 之切點的設定便無法如傳統 AOP 的作法 (在程式語言上下功夫) 那樣的精密了。

2006/07/16

從 Inversion of Control 談 SOA 與 IoC

SOA 是 IoC 的自然演化或延伸, IoC 是 SOA 的開路先鋒

  1. IoC 強調的是依賴注入,控制權反轉。在控制權反轉這事上,SOA 與 IoC 所扮演的角色相同,都是希望元件開發者所開發出來的元件,具有 "Don't call us, we'll call you" - the Hollywood Principle 的特質。然而 IoC 相形之下,著重於元件開發層次,它強調個別元件如何實作,才能達到這項訴求 (例如: type 1 IoC: interface injection, type 2 IoC: setter injection, type 3 IoC: constructor injection)。而 SOA 相形之下,則著重於系統及整體架構。SOA 提供了在系統架構層次,如何達到控制權反轉這類機制的思維。
  2. 關 於依賴注入,SOA 較之 IoC 有更高一層的訴求,即是希望達到 "沒有依賴",或是最低限度依賴的程式。IoC 導向的系統元件,可以達成兩個元件之間,僅相依於兩者間的特定介面。在這種情況下,只要這一介面關係存在,就能替換其中各別元件的實作。而 SOA 則希望能做到,讓系統中的每個元件,儘量使用同一組介面或協定,而不是依賴於其中某些元件的特定介面。如果整個系統都使用同一組介面或協定,代表整個系統 中的任意元件,都可以任意組合。為達到這樣的訴求,系統元件介面便需傾向於使用粗粒度 (coarse-grained) 的介面。
  3. 由於粗粒度的介面無法提供如細粒度 (fine-grained) 介面那樣豐富的語意,因此只好轉由介面參數身上著手,這也就是為何 SOA 強調使用文件導向的參數(亦即參數本身為一含括豐富語意的文件)
  4. 沒 有 IoC,就做不到 SOA:試想,若你的系統架構設計沒有辦法做到控制權反轉及依賴注入,又如何在系統上線後,指定元件之間的參引關係,或是將許多元件編織 (waving) 起來,成為一個作業流程呢。所以有人說,SOA 的觀念或想法並不是用來取代現有的軟體設計觀念,而是在面對模組重用或系統整合時,所需 "額外"、"附加" 考量的思維。