熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

改善Java企業級應用的可用性

2013-11-23 19:36:54  來源: Java核心技術 
對一個在線商務站點來說需要*的服務時間這就是說對商務網站來說保證不間斷的運行是最重要的事任何差錯都會導致客戶不能訪問商務站點提供的信息和服務而這又會導致收入的損失和客戶的報怨

  改善應用可用性的關鍵在於將應用放在專為高可用性設計的工作環境中在基礎框架中高可用性通常是通過各個級別的冗余來取得的但為了更好的利用環境中內建的可用性能應用設計者需要考慮事先考慮高可用性問題需要注意的是一些應用設計上的選擇可能在簡單的環境中正常運行但在高可用環境中卻是低效的例如對一些不會布署在高可用性環境中的應用來說某些設計方式可能會改善其性能

  本文主要討論HA(高可用性)環境中的特性然後會討論一些專門針對HA環境的設計方案最後介紹一些應用級(即使應用不會布署在HA環境中)的改善可用性的最佳實踐

HA環境

  下面是兩個典型的代表極端HA基礎架構的主機環境示例顯示了一個完全布署在一個服務器上完整的JEE環境

  

  Figure Singleserver hosting environment

  在這種環境中HTTP/JEE/RDBM服務器完全共存於同一台物理機器上這可能是最低效的JEE環境了而且也是最少容錯的因為可能只因為潛在的單點錯誤導致整個環境不可用
另一種情況如圖顯示

  

  Figure High availability hosting environment Click on thumbnail to view fullsized image

  這個布署環境由多個數據中心組成通常在不同的地理位置但是保持一致的軟硬件兼容幾乎所有的服務都是冗余的在這個環境中每一個組件都駐留在分離的容錯硬件上這種地理上分離的數據下發環境依賴於數據和群集來同步所有的數據傳送

  兩個HA環境最重要的特性是
  無單點錯誤通過在環境中增加冗余避免單點錯誤這個原則應用應用到所有軟硬件層次
  容錯在發生錯誤時通過負載均衡動態地恢復服務到可用的服務器上

設計利用基礎架構中高可用性的應用

  擁有HA基礎架構並不意味著擁有高可用性的應用如果應用沒有考慮到利用基礎架構中的高可用性是不會擁有高可用性的對這些類型環境的應用設計需要在設計和實現上作額外的考慮

  例如如何在多個數據下發中心間共享會話信息或者如何同步到復制數據庫中來提高終端用戶的體驗下面的關於設計和實現的最佳實踐將有益於利用HA基礎架構和增加應用的可用性

  ·使用只讀JVM緩存在典型的HA配置中應用的幾個實例同時運行在不同的應用服務器上每一個服務器都有自己的JVM因此在你更新本地緩存的數據時更新只能被當前JVM知道其他應用的實例不關心這次更新這就是為什麼你應該將JVM級的緩存作為只讀的但在存在跨越多個JVM的分布式緩存時是個例外取決於你的應用服務器你可以有不同的解決方案或者實現自己的RMI方案

  ·考慮分布式HTTP會話為了解決HTTP協議無狀態的問題應用需要靠HttpSession API來存儲會話信息在群集環境中應用的多個實例運行在不同珠服務器上在使用HttpSession時需要考慮下面幾點

  o   實時地復制會話數據既然你不知道哪個實例會處理會話中的下一個請求會話數據應該實時地同步到群集中的所有服務器這可以通過存儲會話數據在數據庫中並實現數據庫級別的復制就可以了一些應用服務器如WebSphere WebLogic提供了更快的內存會話復制特性如果你使用這類應用服務器你就可以考慮一下了

  o   序列化會話對象存儲在分布式會話中的對象需要實現javaioSerializable接口實現這個接口確保數據可以被無線地傳送到群集中的每一個服務器實例了一個好的方法是強制使用自定義方法如addObjectToSession(String key Serializable value)來代替HttpSessionsetAttribute (String key Object value)區別在於如果你調用addObjectToSession()方法時傳遞了非序列化對象你會得到一個編譯時錯誤而你嘗試復制保存在會話中的非序列化對象時你得到的是運行時錯誤而這會影響用戶體驗

  o   實現容錯性讓應用知道冗余基礎架構資源的存在如果需要的話建議通過動態運行時切換來實現例如如果應用使用消息服務器而且每一個數據中心有一個消息服務器讓給定的數據中心上運行的應用知道在另一個數據中心上的服務器可以作為錯誤的備份

  o    在測試時要有創造性通常你會在與布署環境一致的環境中測試應用但在實際中一個HA產品環境需要比測試環境更多地時間來建立因此完全地鏡像產品環境是代價高的在這種情況下你可以通過創造性的測試來彌補相應環境的缺少你可以使用兩台工作站來模擬HA環境然後你應該考慮下面的測試場景在你關閉一個數據庫時應用是否正常?在一台本地機沒有響應時應用是否能成功從另一台機器連接LDAP服務器?這些類型的測試可以協助測試應用的容錯性


在應用級的改善可用性的最佳實踐

  到目前我們主要還是強調可用性的重要性及如何使基礎架構具有更好的可用性及如何在HA環境下考慮應用的設計接下來我們會講一些在應用級別的改善可用性的設計技巧

  自主的應用資源管理

  避免在應用中硬編碼外部資源是一個通用的實踐通常外部資源是在應用啟動時加載到內存中並作為只讀資源被應用使用外部資源的典型例子如應用的屬性文件(包含可翻譯的文字串)或者是與應用相關的配置信息

  通常外部資源的改變並不會反映到應用的內存中只有重啟應用才能使被改變的外部資源生效而這會臨時中斷應用的服務在這種情況下應用的可用性與他的外部資源的更新頻率直接相關

  一個有效的改善應用的可用性的方式是自動重新加載外部資源而不需要重啟應用下面是自動應用資源管理工具的主要特性及其相關設計和實現的指引

  資源管理器

  周期地檢查外部資源並在其修改時重新加載檢查的周期依賴於業務需求
  提供一種類似用戶初始化式的顯式加載這可以通過浏覽器觸發例如重新加載servlet可以處理這個需要並進行重新加載資源
  使用線程安全的重新加載來確保應用即使在重新加載的過程中再次獲取當前配置數據記住訪問正在被重載的資源可能導致數據的不一致性
  支持各種資源類型如屬性文件和XML文件
  可以使用開源工具如Quartz Scheduler和Apache Commons Configuration
一種資源管理的樣例設計是保存兩份資源內容在一份資源正在更新內存時應用依舊可以查詢到任何需要的信息這保證了應用的可用性是這種設計的圖例

  

  Figure Sample resource manager model Click on thumbnail to view fullsized image

  在應用初始化時資源管理器會加載所有定義在外部屬性文件中的資源文件Resource接口被用來實現創建一個相對於每一人應用資源唯一的Resource類型ResourceContainer類型包含一個ResourceController對象的注冊表引用第一個對象包含兩個特定的Resource類型但同一時間只有一個對象是可用的資源數據通過ResourceContainer接口的get()方法來訪問當應用處理一個請求時ResourceController對象查詢當前可用的Resource實例在一次自動刷新或顯式用戶初始化刷新時ResourceController重新載入當前不可用的實例並將其指定為可用對象同時使原來可用的對象無效

  用這種方式資源管理器工具確保應用資源是最新的完整的並且以線程安全的方式來自動更新而不需要重啟應用這樣就提高應用的可用性

  優雅的錯誤處理

  保證應用可用性的一個重要方面是避免錯誤但如果錯誤確實發生那麼給用戶相對差一些的體驗也比給一個錯誤面頁強提多

  有很多錯誤處理的優雅方案
  在錯誤頁面使用缺省內容定義各種不同場景下的缺省頁面缺省行為的使用很大程度下依賴應用和功能在錯誤時執行的方式例如在我們的一個應用中我們可以定義通用的訪問頁面人作為錯誤頁面
  在錯誤發生時給出警告
  在應用容器級別配置捕獲所有錯誤這可以通過在webxml中定義錯誤頁面來完成

  監視應用狀態

  定義一些測試案例來驗證應用的健康狀態是個好主義這些測試案例可包含的servlet中通過手工或自動工具來執行

  一些監視應用健康狀態的方案如下
  可以通過低優先級的線程/工具來報告應用的健康狀態和發送相關警告
  在應用中嵌入健康監視功能這種類型的監視服務可以通過外部腳本在應用出現問題時通知管理員例如可以在內存不足時發送JVM將要內存溢出的警告

  通過定時的方式來激活外部服務

  如果應用有外部依賴實現對超時的控制有助於處理外部服務沒有響應的情況在超時的情況下如果允許建議使用缺省的行為但在面向事務的應用中可能會有什麼困難

  在軟件開發過程增強質量控制

  應用的可用性關鍵在於應用程序的質量而這可以通過在開發團隊中開展一種可用性思考文化來提升通常采用強調質量的開發實踐可以幫助開發健壯/容錯/高可用的應用具體如下
  成對編碼可以改善代碼的質量
  代碼規范提升代碼質量及使最佳實踐
  自動測試有用的回歸工具
   通過IDE內建的工具檢查代碼質量

小結

  要想在因特網上真正地成功應用必須能夠*不間斷地處理服務請求為了取得高可用性公司通常會在基礎框架上投資來得到多級別的冗余但只在基礎框架上投資是不夠的其上的應用必須設計成能夠利用基礎框架的特點此外設計的最佳實踐也可以改善應用的可用性即使應用不是布署在HA環境中

  關於作者

  Ajay Raina是IBM的應用架構師有多年的JEE產品應用的架構/設計/開發的經驗他在IBM研究院/軟件組/領導過多個項目擅長JEE WebSphere DB和面向對象應用開發及敏捷軟件方法學
John Jimenez是IBM的高級IT專家年以上因特網相關經驗其興趣主要在面向對象設計模式敏捷軟件方法學及因特網技術

  Govind Nishar是IBM Corporate Webmaster團隊的咨詢軟件工程師在JEE應用的設計/實現和基於Java的網頁服務上有超過年的經驗最近他協助在團隊中率行實行敏捷軟件方法(主要是XP)
Ning Yan是IBM的軟件工程師他是最新的軟件工程方法學和網頁技術的傳道者並解決實際的業務問題

  資源

  ·討論HA基礎結構的紅皮書IBM WebSphere V的性能/可伸縮性/HA:
  ·HA設計:_actioncfm?articleId=
  ·網頁耕種可用性和可伸縮性:?p=&rl=
  ·WebLogic Server群集介紹:

  Seven Steps to Highly Available Systems (Sun ): 通向HA系統的七個步驟


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27184.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.