原文 http://blog.youkuaiyun.com/ESoftWind/archive/2006/10/20/1342309.aspx
性能因素
考虑如下问题:一台 WEB 服务器中可能运行着许多 WEB 应 用,它们中每一个都可能被成百的并发用户访问,而每个用户都会产生浏览器会话用于访问特定的应用。所有会话信息都将备份以便服务器失效后能转移到其他服务 器实例中。更糟的是,会话会由于一次次的发生以下情况而变化,包括创建、失效、增加属性、删除属性、修改属性值。甚至是什么都没变,但由于有新的访问而使 最后访问时间变了(由此判断什么时候失效会话)。因此,性能在会话失效转移的解决方案中是个很大的因素。供应商通常会提供一些可调的参数改变服务器行为, 使之适应性能需求。
备份时机
当 客户端的请求被处理后,会话随时改变。由于性能因素,实时备份会话是不明智的。选择备份频率需要平衡。如果备份动作发生得太频繁,性能将急剧下降。如果两 次备份的间隔太长,那么在这间隔之间服务器失效后,很多会话信息将会丢失。不管所有的方式,包括数据库和内存复制,下面是决定备份频率的常用的选项。
l 按 WEB 请求
在 WEB 请求处理结束后,发生响应之前保存数据。这种方式能够保证在失效后备份的会话数据是最新的。
l 按固定的时间间隔
会话在后台按固定的时间间隔保存。这种方式不能保证备份的会话数据是最新的。但由于不需在每次请求之后备份数据,因而有更好的性能。
备份粒度
当备份会话的时候,你还需要决定多少会话状态需要保存。以下是不同产品所有采用的常用的策略。
l 整个会话
每次都将保存所有会话。这种方式为正确保存分布式 WEB 应用的会话提供了最好保证。这种方式简单,内存复制和数据库存储方式都默认采用这种方式。
l 修改过的会话
当会话被修改过后,则备份整个会话。当 “session.setAttribute()” 或 “session.removeAttribute()” 被调用后,则认为会话被修改过。必须保证这些方法调用才修改会话属性,这并不是 J2EE 规范后要求的。但却是正确实现这种方法所需要的。备份修改过的会话减少了会话存储的数量,那些仅仅是读取会话属性的请求将不会触发会话备份的动作。这将带来比备份整个会话更好的性能。
l 修改过的属性
仅仅是保存被修改过的会话属性而不是整个会话。这将最小化备份的会话数据。这种方式带来最好的性能及最小的网络通信。为了保证这种方式工作的正确性,必须依据以下的要点。首先,只能通过调用“ setAttribute() ”方法修改会话状态,并且会话数据要被序列化和备份。其次,确保属性之间没有交叉引用。每个唯一的属性键值下的对象图应当被独立地序列化和保存。如果两个独立的键值下的对象存在交叉引用,它们将不能够正确的序列化和反序列化。例如图 13 所示,在一个内存复制的集群中,会话中存有“ student ”和“ school ”对象,同时“ school ”对象含有到“ student ”对象的引用,某一个时候“ school ”被修改后备份到备份服务器中。在序列化和反序列化之后,在备份服务器的被还原的“ school ”对象的版本将包含整个对象图,包括其引用的“ student ”对象。但是“ student ”对象可以被独立的修改,当它被修改后,仅仅只有它自己被备份。在序列化和反序列化之后,在备份服务器中还原“ student ”对象,但在此时,它将丢失与“ school ”对象的连接。尽管这种方式有最好的性能,但上述限制将影响 WEB 应用程序的架构和设计。特别是需要用会话保存缓存的复杂的用户数据。
图 13 会话复制中的交叉引用
其他失效转移的实现
如前面章节所提到的,当会话备份时粒度对于性能非常重要。然而,当前的一些实现,不管是数据库存储还是内存复制,都将使用 Java 对象序列化技术来传输 Java 对象。这就打了个大印子,影响系统的性能,并给 WEB 应用程序的架构和设计带来很多的限制。一些 J2EE 供应商便寻找一些特别的手段来更为轻量地,小印子地实现 WEB 集群,提供细粒度的分布式对象共享机制用于提高集群的性能。
Jrun 的 Jini 技术
Jrun4 将它的集群解决方案构在 Jini 技术之上。 Jini 为分布式计算而生,它允许在一个单一的分布式计算空间内创建“联合”的设备或组件。 Jini 提供查找,注册,租用等分布式系统服务,这对集群环境非常有用。另一种称为 JavaSpace 的技术构建于 Jini 之上,它提供了一些用于实现集群非常有价值的特性,如对象处理,共享,迁移等。要了解有关 Jini 和 JavaSpace 更多的信息,请参考 http://java.sun.com/products/jini/2_0index.html
Tangosol 的分布式缓存
Tangosol Coherence 提供了一个分布式数据管理平台,它可以嵌入到大多数流行的 J2EE 服务器中用于实现集群环境。 Tangosol Coherence 同时也是提供了分布式缓存系统用于在不同的 JVM 之间有效地共享 Java 对象。要了解有关 Tangosol 更多的信息,请参考 http://www.tangosol.com