热部署Java EAR以最小化或消除服务器上应用程序的停机时间?

时间:2008-10-21 13:17:01

标签: java deployment jboss

我听说这是JavaRebel所做的,但是有没有其他好的方法来部署新版本的EAR,同时允许用户在以前的版本上保持活动状态?我们将JBoss用于应用程序服务器......

4 个答案:

答案 0 :(得分:5)

这不是JavaRebel所做的。 JavaRebel(根据描述)热替换内存中的类。在与系统的现有连接的情况下,这是不可接受的,因为更新的类可能会破坏客户端的逻辑。

一旦我工作的公司遇到了类似的问题,就会以这种方式解决:

  • 智能路由器用作负载均衡器
  • 新版本已部署到(新)群集的50%节点
  • 新连接严格传递给这些更新的节点,旧节点在旧节点之间平衡
  • 旧节点脱机(一个接一个,以保持每个节点的客户端数量在限制范围内)
  • 同时,新版本部署到离线的“旧”节点,并将它们作为新节点启动
  • 由于EJB群集,会话和bean被其他旧节点
  • 选中
  • 最终(在几个小时内),只剩下一个旧节点,只有一个旧版本实例,所有使用旧版本的客户端都连接到它
  • 当最后一个旧客户端断开连接时,该节点过于耗尽

现在,我不是网络人,也不能给你很多细节(比如什么是路由器硬件等)。我的理解可以很简单,但是,如果我没记错的话,我们必须设置一个额外的Weblogic域来部署应用程序的新版本(否则它将与JNDI名称上的旧版本冲突)。

希望有所帮助。

P.S。 Ichorus提供了一条评论说该应用程序部署在客户端的服务器上。所以路由器技巧可能不可行。现在,我现在只看到一个可行的解决方案(现在是21:52,我可能忽视了一些事情:)) -

  • 使用“版本化”JNDI名称开发新版本;例如如果Customer bean在版本1中的ejb / Customer下,在版本2中它将在ejb / Customer2下
  • 在应用程序中拥有一个具有稳定基本界面(工厂风格)的业务外观,当被要求使用Customer bean时,尝试查找版本最高的JNDI名称(当然,不是每次调用都可以缓存为小时左右)。该外观可以(并且应该)作为单独的应用程序部署 - 并且从不或很少更新
  • 现在每个新客户端都可以访问部署的最新应用程序,并且应用程序不会发生冲突。

这种方法需要仔细规划和测试,但应该适用于恕我直言。

我最近以类似的方式修改了一些应用程序,让它们在同一个域中共存(在它们为不同的数据源使用相同的JNDI名称之前)。

答案 1 :(得分:1)

据我所知,WebLogic有一项称为并行部署的功能,可以消除EAR版本升级期间的停机时间。您可以在不停止现有应用程序的情况下部署新版本,并且在成功部署新版本后,您可以透明地从旧版本切换到新版本。

我不确定其他应用服务器是否支持此功能。

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

答案 2 :(得分:1)

弗拉基米尔关于使用负载均衡器的建议是实现您想要的非常可靠的方法。请记住,它不一定是高端硬件负载平衡器。相反,如果您使用本机Web服务器(Apache或IIS)和mod_jk或mod_proxy来安装JBoss服务器,则可以维护一个公共Web外观并在EAR升级时实现适用的加载和路由例程。

//尼古拉斯

答案 3 :(得分:0)

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