高影响力的Web层群集,第一部分: 利用JavaGroups扩展 - 编程入门网
系统崩溃,购物车请求也可以在任何时候被定向到服务器 A 或服务器 B,因为会话存在于这两台服务器上并可以在任何一台服务器上被更改。入站请求可以被定向 到当前具有最低工作负载的服务器 (叫做 负载平衡),这对于购物者是透明的。正如您可以 看到的,使用 JavaGroups 进行的跨一群机器的 Web 层会话复制可以提供高可用性的服务, 并且具有 fail-over 和负载平衡的可能性。
会话复制中的问题 正如我现在将要阐述的,会话复制中会有问题。启动 JGCart 的另一个实例 (在 LAN 中 的另一台机器上或者在同一台机器上)。现在,返回到初始实例,并且又添加一些商品。图 11 演示您应该看到的东西: 图 11. 不同步复制的 JGCart 会话 高影响力的Web层群集,第一部分: 利用JavaGroups扩展(11)时间:2011-04-16 IBM Sing Li尽管到购物车会话中的所有添加动作仍然会被复制到第二个实例,但是这两个实例完全是 不同步的。当然,这一问题的原因是,我们已经在第一个购物车中放入了几件商品之后才启 动第二个实例。一开始我们没有遇到这个问题,是因为我们是在同一时间启动的所有复制会 话。 在群集实现中,强调群集中的机器都在同一时间启动是不合理的。实际上,我们应该能够 在任何时候添加或删除机器。这就要求新加入群集的机器能够从复制的会话那里请求“ 当前状态”。没有什么奇怪的,JavaGroup 的 JChannel 特别为此提供了一个 STATE_TRANSFER 微协议。参见 参考资料 部分,以了解有关 STATE_TRANSFER 微协议实现的 详细信息。 利用 JavaGroups 编码状态传输逻辑 为了在 JGCart 应用中加入状态传输功能,我们必须添加执行以下任务的代码: 1. 设置 Channel 选项以响应 GET_STATE 请求。默认情况下,来自 STATE_TRANSFER 协 议的任何 GET_STATE 事件不会被传播到应用,以简化典型的客户端实现。在我们的案例中, 我们想要接收 GET_STATE 事件。清单 3 显示了我们如何设置该选项 (以红色高亮显示)。这 是在 PrepareChannel() 方法内完成的。 2. 在连接到通道之后,调用 JChannel 的 getState() 方法,以从群集获得当前状态 ( 因为会话是在群集中相等地复制的,因此可以从任何成员获得当前状态),见清单 3 (以绿色 高亮显示)。同样,它也是 PrepareChannel() 方法的一部分。 清单 3. 为状态传输准备通道 3. 从微协议栈接收到 SET_STATE 请求之后, PullPushAdapter 实例将回调 MessageListener 接口的 setState() 方法。我们需要实现该方法来设置我们的状态。清单 4 显示了这一实现。这里,我们只是设置了私有 cstate 变量,然后利用 cstate 更新 TableModel。这将自动更新 GUI 视图,因为 Swing 库例程将同步 GUI 视图和 TableModel 。 清单 4. 在状态传输期间设置 JGCart 的状态 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |