2007年2月25日 星期日

WebServices技術的錯誤運用

WebServices技術的錯誤運用



每當有些新的技術出來 , 就會有人把它掛在嘴邊 , 似乎是萬能丹
可是要小心不要落入錯用新的技術的陷阱中
WebService s? 現在已經不新了吧
隨便舉個應用的例子好了 ,
有些 FlowEngine的產品或是要與FlowEngine整合的系統 , 馬上想到要使用的方式就是 WebServices ,
這種想法有沒有問題呢?


首先要記得 WebServices
1.叫用遠端的服務 ,
2.參數的傳入與結果的傳回都是使用 XML 格式
叫用遠端的服務 , 看起來沒有什麼大問題啊?
事實上 , 如果你有點年紀有使用過 COM+ 跟 EJB 的話 ,
COM+ , EJB 也都是提供遠端呼叫的元件規範
在那個時候 , 就有人濫用這種方式而導致網路與系統效能的降低
舉例來說:
假設Server端有一個 COM+ 物件 X , 提供 methodA , methodB , methodC 三個 Function Call
而你有一個Client端程式的交易是需要呼叫 methodA , 然後呼叫 methodB , 然後呼叫 methodC,
那你會發現透過 TCP方式,你的網路呼叫的往返次數至少是6次,
如果你在Server端有一個 COM+ 物件 Y 提供 methodTran , method內部就是包含了 methodA , methodB , methodC的呼叫
而你的Client端程式去叫用 Y.methodTran 時 , 網路呼叫的往返次數只有 2 次
這中間對於效能就有影響了,網路往返的次數少,花費在網路上的時間就減少,積少成多,效能就變快了
此外在網路呼叫的次數上 , 也會影響網路的頻寬使用
所以在 COM+ 時代 , 就有人提出相關的使用樣式

類似的狀況, 在EJB也反映出來相關的問題 , 所以Core J2EE Patterns 樣式中 , 就出現了DTO(Data Transfer Object)
就是為了避免呼叫EJB的method 時 , 傳入傳回的都是單一的屬性值 , 但是卻要進行多次的網路呼叫,
將可以進行一次網路呼叫並且取回的結果封裝成一個物件傳回 , 為的也是相同的原因 ,
避免多次網路呼叫 , 系統效能會變差 , 並且影響網路頻寬 ,

不是要談 WebServices 嗎? , 怎麼開始講古了呢? , 講到 EJB / COM+ 去了?
重複上面提到的 WebServices的基本要項首先要記得 WebServices 1.叫用遠端的服務 , 2.參數的傳入與結果的傳回都是使用 XML 格式當然這裡面有個潛規則就是叫用遠端服務如何叫用 是透過網路 , 看起來好像是廢話 , 沒有網路如何呼叫遠端服務?
剛剛談到了 COM+ , EJB 在提供遠端服務的 method 時 , 其中一個影響要素就是 網路
當然使用的網路協定還是基於TCP協定(HTTP/FTP/SMTP)
所以COM+ / EJB 碰到的問題 , WebService 還是一樣會碰到 , 就是不要提供過細的method服務

你可以想像有人可能會濫用過細的WebServices 然後用在可能是上千萬筆的檔案轉換上面(Ex:轉檔) ,
可能是上千萬 次的WebService Call, 這個除了帶來程式的效能很差的結果之外 ,
也可能會影響到網路的頻寬使用
記得上面提到 WebServices的要項2嗎? 2.參數的傳入與結果的傳回都是使用 XML 格式
也就是說如果你呼叫過細的method 服務 , 你需要傳入XML ,也需要傳回XML , 這樣的資料量 , 可能遠遠大於你真正要傳回的資料
這些會吃掉你的網路頻寬 , 而當網路頻寬被吃掉 , 就是其他別的系統可能也需要網路頻寬 , 卻因為網路頻寬不足而導致別的系統服務的效能
也變差
所以不要濫用WebServices ,
如果你不是把它使用在交易服務 , 而是許多細小的資料查詢上面的話 , 那你就是濫用了
回過頭來看 , 最原始的問題
"有些 FlowEngine的產品或是要與FlowEngine整合的系統 , 馬上想到要使用的方式就是 WebServices ,這種想法有沒有問題呢?"

那要看看你的 Flow Engine 的呼叫對象 , 到底是會呼叫非常多次細項的資料處理的WebServices 還是呼叫一次交易處理的WebServices
如果是前者 , 那我只能提醒你 , 你的系統可能會有效能不佳並且導致整個網路頻寬被佔用的情況
如果你的人員或是外包商中會提出這樣的系統設計的 , 也請注意 , 他們可能只是知道有個WebServices的技術可以用 , 但是卻不會進一步深思 , 用法有沒有問題

WebServices 不是不好 , 而是要小心的用 , 正確的用 ,
用的不好 , 只能說你再換一個 128顆CPU的主機(現在應該還沒有這種商用主機吧 , 誇張的說法)系統還是跑不快... 當然如果你的Server間的網路都改用光纖或許可以改善...
關於系統效能不佳 , 平台人員要求換機器那又是另外的主題了...
這篇主題中還有一個要點沒有提到的就是關於交易處理的部分 , 它也是影響系統效能表現的要點

不要說我舉的例子太蠢 , 不會有人犯這種蠢錯誤 ,
就是有看過 , 而且還不少...