2008-10-21 54 views

回答

5

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

一旦一家公司,我工作也有类似的问题,它解决了这种方式:

  • 智能路由器用作负载平衡器
  • 新版本部署到50% (新)簇的节点
  • 新的连接被严格地传送到这些更新的节点,旧节点在旧节点之间被平衡
  • 旧节点被脱机(一个接一个地保持数目客户端节点内的每个节点)
  • 同时,新版本部署到离线“老”的节点,他们被带到了新的节点
  • 由于EJB集群,会议和豆类被其他老节点
  • 最终回升(在几个小时内),只有一个旧节点左,具有旧版本,并使用旧版本的所有客户端的情况下被连接到它
  • 当最后一个旧的客户端断开了,这点太放倒

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

希望有所帮助。

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

  • 开发带有“版本化”JNDI名称的新版本;例如如果Customer bean在版本1中处于ejb/Customer之下,则在版本2中它将位于ejb/Customer2下
  • 在应用程序中具有稳定的基本接口(工厂风格)的业务外观,当询问Customer bean时,试图找到最高版本的JNDI名称(不是在每次调用时,当然可以缓存一个小时左右)。该外观可以(也应该)作为单独的应用程序进行部署 - 而且从未或很少更新
  • 现在,每个新客户端都可以访问部署的最新应用程序,并且应用程序不会发生冲突。

这种方法需要仔细的规划和测试,但应该工作恕我直言。

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

+0

这是有帮助的,一个非常简单和合理的解决方案。不幸的是,我们的许多客户端没有负载均衡器,我们的会话状态保存的方式只有一点点,并且只保存在本地应用服务器的缓存中(我一直主张对其进行更改)。感谢您的输入。 – Ichorus 2008-10-21 20:04:01

+0

哦,所以你正在客户端的服务器上部署你的应用程序?当然,这变化很大。除非在JNDI名称中实现某种版本控制,否则不可能,我会说... – 2008-10-22 01:50:44

1

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

我不确定其他应用程序服务器是否支持此操作。

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

1

弗拉基米尔周围使用负载平衡器的建议是实现你想要的东西的一个相当肯定的方式。请记住,它不一定是高端硬件负载平衡器。相反,如果您使用本机Web服务器(Apache或IIS)以及mod_jk或mod_proxy提交您的JBoss服务器,则可以维护一个常见的Web Facade并在EAR升级时实施适用的加载和路由例程。

//尼古拉斯

相关问题