簡體   English   中英

熱部署Java EAR以最小化或消除服務器上應用程序的停機時間?

[英]Hot Deploy a Java EAR to Minimize or Eliminate Downtime of an Application on a Server?

我聽說這是JavaRebel所做的,但有沒有其他好的方法來部署新版本的EAR,同時允許用戶在以前的版本上保持活動狀態? 我們將JBoss用於應用服務器......

這不是JavaRebel所做的。 JavaRebel(根據描述)熱替換內存中的類。 在與系統的現有連接的情況下,這是不可接受的,因為更新的類可能會破壞客戶端的邏輯。

一旦我工作的公司有類似的問題,它就這樣解決了:

  • 智能路由器用作負載均衡器
  • 新版本部署到(新)集群的50%節點
  • 新連接嚴格地傳遞給這些更新的節點,舊節點在舊節點之間平衡
  • 舊節點脫機(一個接一個,以保持每個節點的客戶端數量在限制范圍內)
  • 與此同時,新版本被部署到離線“舊”節點,並將它們作為新節點啟動
  • 由於EJB集群,會話和bean被其他舊節點選中
  • 最終(在幾個小時內),只剩下一個舊節點,只有一個舊版本實例,所有使用舊版本的客戶端都連接到它
  • 當最后一個舊客戶端斷開連接時,該節點太低了

現在,我不是一個網絡人,也不能給你很多細節(比如什么是路由器硬件等)。 我的理解可以很簡單,但是,如果我沒記錯的話,我們必須設置一個額外的Weblogic域來部署應用程序的新版本(否則它將與JNDI名稱上的舊版本沖突)。

希望有所幫助。

PS Ichorus提供了一條評論說該應用程序部署在客戶端的服務器上。 所以路由器技巧可能不可行。 現在,我現在只看到一個可行的解決方案(現在是21:52,我可能忽視了一些事情:)) -

  • 使用“版本化”JNDI名稱開發新版本; 例如,如果Customer bean在版本1中的ejb / Customer下,則在版本2中,它將在ejb / Customer2下
  • 在應用程序中有一個具有穩定基本界面(工廠風格)的業務外觀,當被要求使用Customer bean時,它會嘗試查找版本最高的JNDI名稱(當然,不是每次調用都可以緩存一小時左右) )。 該外觀可以(並且應該)作為單獨的應用程序部署 - 並且從不或很少更新
  • 現在,每個新客戶端都可以訪問部署的最新應用程序,並且應用程序不會發生沖突。

這種方法需要仔細規划和測試,但應該工作恕我直言。

我最近以類似的方式修改了一些應用程序,讓它們在同一個域中共存(在它們為不同的數據源使用相同的JNDI名稱之前)。

據我所知,WebLogic有一個稱為並行部署的功能,可以消除EAR版本升級期間的停機時間。 您可以在不停止現有應用程序的情況下部署新版本,並且在成功部署新版本后,您可以透明地從舊版本切換到新版本。

我不確定其他應用程序服務器是否支持此功能。

參考: http://edocs.bea.com/wls/docs100/deployment/redeploy.html#wp1022490

弗拉基米爾關於使用負載均衡器的建議是實現你想要的非常可靠的方法。 請記住,它不一定是高端硬件負載平衡器。 相反,如果您使用本機Web服務器(Apache或IIS)和mod_jk或mod_proxy來安裝JBoss服務器,則可以維護一個公共Web外觀並在EAR升級時實現適用的加載和路由例程。

//尼古拉斯

我想你可能想要使用OSGI框架來研究Spring。 http://www.springframework.org/osgi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM