代码之家  ›  专栏  ›  技术社区  ›  Ichorus

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

  •  7
  • Ichorus  · 技术社区  · 17 年前

    我听说JavaRebel就是这么做的,但是有没有其他好的方法来部署新版本的EAR,同时允许用户在以前的版本上保持活动状态?我们使用JBoss作为应用服务器。。。

    4 回复  |  直到 17 年前
        1
  •  5
  •   Vladimir Dyuzhev    17 年前

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

    有一次,我在一家公司工作,遇到了类似的问题,解决方法如下:

    • 智能路由器被用作负载均衡器
    • 新版本已部署到(新)群集的50%节点
    • 旧节点已脱机(一个接一个,以使每个节点的客户端数量保持在限制范围内)
    • 同时,新版本被部署到离线的“旧”节点上,并作为新节点提出来
    • 最后(几个小时后),只剩下一个旧节点,只有一个旧版本的实例,所有使用旧版本的客户端都连接到它
    • 当最后一个旧客户端断开连接时,该节点已关闭

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

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

    • 在应用程序中有一个具有稳定的基本接口(工厂风格)的业务外观,当要求客户bean时,它会尝试查找最高版本的JNDI名称(当然不是每次调用都可以缓存一个小时左右)。该外观可以(也应该)作为一个单独的应用程序进行部署——而且从未或很少更新

    这种方法需要仔细的计划和测试,但应该在IMHO中起作用。

        2
  •  1
  •   Rejeev Divakaran    17 年前

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

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

        3
  •  1
  •   Nicholas    17 年前

    Vladimir关于使用负载平衡器的建议是实现您想要的目标的一种非常可靠的方法。请记住,它不一定是高端硬件负载平衡器。相反,如果您使用本机web服务器(Apache或IIS)和mod_jk或mod_代理前置JBoss服务器,那么您可以维护一个公共web外观,并在EAR升级时实现适用的加载和路由例程。

        4
  •  0
  •   user26365    17 年前

    我认为您可能希望使用OSGI框架研究Spring。 http://www.springframework.org/osgi