Java web应用程序在集群环境中工作的要求是什么

Java web应用程序在集群环境中工作的要求是什么,java,java-ee-6,cluster-computing,Java,Java Ee 6,Cluster Computing,我需要检查现有的web应用程序是否准备好部署到集群环境中 集群: 几个Linux盒子。流由使用简单循环算法和粘性会话的负载平衡器控制。 应用程序 无状态(希望是)java web应用程序,从后台检索内容并适当格式化。 我可以访问源代码。我应该签入哪些代码以确保它将在集群中运行 检查存储应用程序状态的内存或文件系统中是否未缓存某些内容 …还有别的吗 如果您使用的是EJB(如果您访问数据库,建议使用EJB),那么以下是限制列表: 我猜类似的限制也适用于web应用程序。检查应用程序最简单的方法

我需要检查现有的web应用程序是否准备好部署到集群环境中
集群
几个Linux盒子。流由使用简单循环算法和粘性会话的负载平衡器控制。
应用程序 无状态(希望是)java web应用程序,从后台检索内容并适当格式化。

我可以访问源代码。我应该签入哪些代码以确保它将在集群中运行

  • 检查存储应用程序状态的内存或文件系统中是否未缓存某些内容
  • …还有别的吗
如果您使用的是EJB(如果您访问数据库,建议使用EJB),那么以下是限制列表:


我猜类似的限制也适用于web应用程序。

检查应用程序最简单的方法是让它在两台服务器上运行,并且数据相同,因此在启动时,两台服务器都处于相同的状态。让我们假设一个用户要完成一个操作,浏览器将向您的web应用发出两个连续的HTTP请求——您需要做的是第一次调用web服务器1,第二次调用web服务器2;然后尝试另一种方法,将两个请求都发送到同一个Web服务器——如果每次都得到相同的结果,则很可能已经准备好对应用程序进行集群。(这并不意味着应用程序已经准备好集群,因为它存储在内存中的对象状态等可能不容易从前端发现,但它让你更可能可以在集群中运行。)

如果它真的是“无状态的”,就不会有问题,您可以在任何时候向任何服务器发出任何请求,一切都可以正常工作。大多数事情都不是那么容易,因此任何类型的状态都必须在页面从客户端移动到服务器时流式传输到页面或从页面流式传输到服务器,或者存储在后端,并来回传递某种令牌,以便从用于此目的的任何共享数据存储中检索它。如果他们正在使用HttpSession,那么从会话中检索到的任何内容(如果修改)都需要使用session.setAttribute(key,value)设置回会话中。该属性的设置充当一个信号,表明会话中存储的任何内容都需要复制到冗余服务器。确保会话中存储的任何内容都实现并实际上是可序列化的。有些服务器允许您存储对象(我正在查看weblogic),但在尝试复制对象时会抛出异常。我有很多同事抱怨说,必须将内容设置回会话应该是多余的,也许应该是这样,但这正是事情的工作方式。

如果处理得当,状态并不是一个大问题。无论如何,所有应用程序都有状态。即使提供某种程度的静态文件,与URL关联的文件内容实际上也是状态的一部分

问题在于如何传播和共享此状态

  • 用户会话中的状态是不需要动脑筋的。使用会话复制机制(速度较慢,但在节点崩溃时不会丢失会话)或会话粘性负载平衡器,您的问题就会得到解决
所有其他共享状态确实是一个问题。特别是,即使是缓存状态也必须共享并完全一致,否则,根据witch web服务器的不同,同一页面上的刷新可能会随机生成不同的结果,从而导致命中的缓存

您仍然可以使用共享缓存(如ehcache)缓存数据,或者故障恢复到会话


我想很难确定应用程序是否真的能在集群环境中工作,因为某个模糊服务中的单例,某个地方的静态成员,任何东西都可能产生奇怪的结果。您可以肯定地验证通用体系结构,但在投入生产之前,您需要实际执行并执行一些验证测试。

我相信,决定应用程序是否可以在集群环境中运行的不仅仅是您在数据库中读写数据的方式@丽芙:我没那么说。但是这个链接提供了关于访问文件系统的有用提示。