将BlazeDS消息同步到两个Web服务器

时间:2012-03-05 02:11:20

标签: flex blazeds

我有一个Flex / BlazeDS webapp(伪内容管理系统),在2个Weblogic 10.3服务器上运行Java后端,用于负载平衡和HA目的。

基本上,我正在使用AMF轮询更新我的应用程序,以便当用户从搜索结果中打开文档时,相应的行将在屏幕上当前具有该文档的所有用户显示中显示锁定图标。 / p>

我遇到的问题是,如果连接到服务器A的用户打开文档X,则锁定的图标将仅显示在连接到服务器A的其他用户的屏幕上。连接到服务器B的用户的显示将不会更新。是否有任何既定的范例或最佳实践来确保锁定的更新将在所有服务器上传播?

2 个答案:

答案 0 :(得分:2)

我建议使用数据库锁定(您只需要一个布尔标志和一个干净的事务隔离)和一个分布式JMS主题,以便将锁定事件分派给所有其他用户。我不知道你是否以及如何使用BlazeDS做到这一点,但用GraniteDS设置这种架构很容易。

基本上,当用户请求文档时,事务性服务器端bean(比如EJB3)必须检查资源是否可用,将其锁定并将锁定事件发布到分布式JMS主题。由于主题是分布式的,因此将在所有WebLogic节点上分派消息,并且所有连接的用户(无论他们连接到哪个群集节点)都将通过长轮询消费者通知此事件。 GraniteDS对WebLogic异步servlet有很好的支持(参见GravityWebLogicServlet),它将为您的用户提供比简单轮询更多的实时体验,并且不会影响可伸缩性(异步servlet意味着用于这种设置)。

一些额外的资源:

  • GraniteDS的实时消息documentation
  • 关于GraniteDS'群集,HA和实时消息传递功能的简短video(尽管使用JBoss和基本聊天应用程序)。

即使您不希望也不能在项目中使用GraniteDS,我建议您考虑这个分布式JMS主题是您问题的最佳和最可靠的解决方案。

答案 1 :(得分:1)

最简单的方法是使用数据库实现的锁(如果您已在应用程序中使用数据库)。

另一种解决方案是实现发布者/订阅者方案并使用描述为here的BlazeDS群集功能。使用JGroups,可以将BlazeDS配置为在群集中工作,并且由发布者创建的消息(锁定文档)将传播到所有发布者。

描述了BlazeDS消息传递功能here。我仍然推荐第一个版本(数据库)。

对于更多“异国情调”选项,您可以尝试使用ZooKeeper,Hazelcast等。但是,我不会在您的情况下使用它们。