Java理论与实践: Web层的状态复制 - 编程入门网
Object getAttribute(String s);
Enumeration getAttributeNames();
void setAttribute(String s, Object o);
void removeAttribute(String s);
boolean isNew();
void invalidate();
void setMaxInactiveInterval(int i);
int getMaxInactiveInterval();
...
}
理论上,可以跨群集一致性地完全复制会话状态,这样群集中的所有节点都 可以服务任何请求,一个简单的负载平衡器可以以轮询方式传送请求,避开有故 障的主机。不过,这种紧密的复制有很高的性能成本,并且难于实现,当群集接 近某一规模时,还会有伸缩性的问题。 一种更常用的方式是将负载平衡与会话相似性(affinity) 结合起来 —— 负载平衡器可以将会话与连接相关联,并将会话中以后的请求发送给同一服务器 。有很多硬件和软件负载平衡器支持这个功能,并且这意味着只有主连接主机和 会话需要故障转移到另一台服务器时才访问复制的会话信息。 复制方式 复制提供了一些可能的好处,包括可用性、容错和伸缩性。此外,有大量会 话复制的方法可用:方法的选择取决于应用程序群集的规模、复制的目标和 servlet 容器支持的复制设施。复制有性能成本,包括 CPU 周期(存储在会话 中的序列化对象)、网络带宽(广播更新),以及基于磁盘的方案中写入到磁盘 或者数据库的成本。 几乎所有 servlet 容器都通过存储在 HttpSession 中的序列化对象进行 HttpSession 复制,所以如果是创建一个分布式应用程序,应当确保只将可序列 化对象放到会话中。(一些容器对像 EJB 引用、事务上下文、还有其他非可序 列化的 J2EE 对象类型有特殊的处理。) Java理论与实践: Web层的状态复制(2)时间:2010-12-21 IBM Brian Goetz基于 JDBC 的复制 一种会话复制的方法是序列化会话内容并将它写入数据库。这种方法相当直 观,其优点是不仅会话可以故障转移到其他主机,而且即使整个群集失效,会话 数据也可以保存下来。基于数据库的复制的缺点是性能成本 —— 数据库事务是 昂贵的。虽然它可以在 Web 层很好地伸缩,但是它可能在数据层产生伸缩问题 —— 如果群集增长大到一定程度,扩展数据层以容纳会话数据会很困难或者成 本无法接受。 基于文件的复制 基于文件的复制类似于使用数据库存储序列化的会话,只不过是使用共享文 件服务器而不是数据库来存储会话数据。这种方式的成本一般比使用数据库的成 本(硬件成本、软件许可证和计算开销)低,其代价则是可靠性(数据库可提供 比文件系统更强的持久化保证)。 基于内存的复制 另一种复制方式是与群集中的一个或者多个其他服务器共享序列化的会话数 据副本。复制所有会话到所有主机中提供了最大的可用性,并且负载平衡最容易 ,但是因为复制消息所消耗的每个节点的内存和网络带宽,最终会限制群集的规 模。一些应用服务器支持与“伙伴(buddy)”节点的基于内存的复制,其中每 一个会话存在于主服务器上和一台(或更多)备份服务器上。这种方案比将所有 会话复制到所有服务器的伸缩性更好,但是当需要将会话故障转移到另一台服务 器上时会使负载平衡任务复杂化,因为它必须找出另外哪一台(几台)服务器有 这个会话。 时间考虑 除了决定如何存储复制会话数据,还有什么时候复制数据的问题。最可靠但 也最昂贵的方法是每次数据改变时复制它(如每次 servlet 调用结束)。不那 么昂贵、但是在故障时会有丢失一些数据的风险的方法是在每超过 N 秒时复制 数据。 与时间问题有关的问题是,是复制整个会话还是只试尝复制会话中改变了的 属性(它包含的数据会少得多)。这些都需要在可靠性和性能之间进行取舍。 Servlet 开发人员应当认识到 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |