我有一个Flex/BrazeDS-webapp(伪内容管理系统),它的Java后端运行在2台Weblogic 10.3服务器上,用于负载平衡和HA目的。
基本上,我使用AMF轮询来更新我的应用程序,这样当用户从搜索结果中打开文档时,相应的行将在当前屏幕上显示该文档的所有用户显示器上显示一个锁定图标。
我遇到的问题是,如果连接到服务器a的用户打开文档X,锁定的图标将只出现在连接到服务器a.的其他用户的屏幕上。连接到服务器B的用户的显示将不会更新。是否有任何既定的范例或最佳实践来确保锁定的更新将在所有服务器上传播?
我建议使用数据库锁定(您只需要一个布尔标志和一个干净的事务隔离)和分布式JMS主题,以便将锁定事件分派给所有其他用户。我不知道BlazeDS是否以及如何做到这一点,但使用GraniteDS设置这种架构会很容易。
基本上,当用户请求文档时,事务性服务器端bean(比如EJB3)必须检查资源是否可用,锁定它,并将锁定事件发布到分布式JMS主题。由于主题是分布式的,因此消息将在所有WebLogic节点上调度,并且所有连接的用户,无论他们连接到哪个集群节点,都将通过长时间轮询消费者来通知此事件。GraniteDS对WebLogic异步servlet有很好的支持(请参阅GravityWebLogicServlet),与简单的轮询相比,它将为您的用户提供更多实时体验,并且不会影响可扩展性(异步servlet用于这种设置)。
一些额外资源:
- GraniteDS的实时消息文档
- 一个关于GraniteDS集群、HA和实时消息功能的短视频(尽管有JBoss和一个基本的聊天应用程序)
即使你不想或不能在你的项目中使用GraniteDS,我也建议你考虑这个分布式JMS主题对你的问题有最好、最可靠的解决方案。
最简单的方法是使用数据库实现的锁(如果您已经在应用程序中使用数据库)。
另一个解决方案是实现发布者/订阅者场景,并使用BlazeDS集群功能,如本文所述。使用JGroups,BlazeDS可以配置为在集群中工作,并且由发布者创建的消息(锁定文档)将传播到所有发布者。
BlazeDS消息传递功能在这里进行了描述。我仍然推荐第一个版本(数据库)。
对于更多"异国情调"的选择,你可以尝试ZooKeeper、Hazelcast等。然而,我不会在你的情况下使用它们。