很多人會問二個問題 : 1) 為什麼使用叢集後, 負載沒有平衡? 2) Servlet收到Client要求, 呼叫同一部WLS instance裡的EJB, EJB物件死了, 怎麼沒有轉移到其他部執行?
回答這些問題前, 先解釋二個名詞, 在叢集部署時, 最簡單的有二種情況, 第一種是Web Container跟EJB Container在同一個WLS Instance裡, 這我們叫Basic Architecture或2-Tier Architecture; 第二種稱為Multi-Tier Architecture, 這種狀況是Web Container與EJB Container跑在不同的機器上。
首先, 先回答第一個問題, 這通常發生在2-Tier Architecture中, 而且應用程式均部署再每一台伺服器, 負載不平均有可能是因為EJB的呼叫不平均, 為什麼? 根據文件, 我可能已經指定一種演算法(Round-Robin, Weight-Based, Parameter-Based或Random)了, 理論上EJB呼叫應該均勻分配, 不是嗎? 答案不是的! WebLogic 會最佳化這個腳本, 因為Servlet跟EJB在同一個WebLogic Server Instance裡都有了, 何必遠求浪費時間呢? 這就跟我們要吃鼎泰豐一樣, 既然台灣都有了, 何必跑到日本吃, 有比較便宜嗎? 所以當這些物件被放在一起時, 就不會根據指定的負載平衡演算法來走, 而是找本地的, 詳細說明在這裡http://e-docs.bea.com/wls/docs81/cluster/load_balancing.html#1008605的Optimization for Collocated Objects小節。除了這個原因, 也可能是其他因素, 例如我們觀察的時間太短, 負載平衡應該是在較長的時間中的統計結果。
第一個問題其實已經說明第二個問題, 注意在叢集運作裡, 其實是以WLS Instance為單位, 更簡單的說是JVM, 負載透過平均分散在不同的JVM以達到平衡的效果。跟第一個問題同樣的設定腳本, Servlet呼叫的EJB物件無法使用, 請問有這樣的狀況嗎? 會有這樣的狀況通常Web Container也跟著掛了, 更可能連JVM都有問題了, 怎麼可能有問題的Servlet再去呼叫其他台可用的EJB? 所以區分的界限是在OS的Process是否正常。當然隨著技術演進, 這樣的設計可能過時, 但很清楚的是, 天下沒有白吃的午餐, 當要求越多, 付出也會越多。
因此, 要充分達到我們的理想, 就要使用Multi-Tier架構, Web App獨立一層, EJB獨立一層, 這樣富在就能夠根據演算法分配, 所有的EJB使用都是遠端的, 當有非應用程式的錯誤時, 就可以轉移到其他伺服器上執行, 雖然達到目標且更有彈性與伸縮性, 但是增加了管理上的難度。
沒有留言:
張貼留言