Wildfly - 在不同节点上的2个Websockets之间的通信?

时间:2014-05-23 15:01:41

标签: java-ee jboss websocket cluster-computing wildfly

我们正在开发一个包含一些基本的聊天/消息传递功能的应用程序。 Web应用程序部署在Wildfly 8.x上,并使用标准的JavaEE 7库(而不是像Spring这样的其他应用程序框架)我们正在利用Websockets实现这一目标,因为我们需要推送到浏览器的功能提供。但是,我们正在以群集/ HA配置部署此Web应用程序。如果UserA连接到NodeA并传入一条发往连接到NodeB的UserB的消息,我们如何传输此消息?

在单节点配置中,简单的答案是维护具有所有Websockets和会话的静态MapList,并根据消息目标路由到相应的Websocket 。但是,有多个节点显然无法工作,因为静态Map / List是每个JVM。

我们将如何实现这一目标?是否可以使用JMS并让每个Websocket充当JMS侦听器?这会对资源利用率或可扩展性和性能产生什么影响?

我们对如何解决这个问题感到有点失落,并且非常感谢你能给出的任何建议。

3 个答案:

答案 0 :(得分:3)

你可以用两种方式做到这一点

1)您可以在不同的Web服务器上创建单独的推送服务,使发布者和订阅者可以收听此服务。将此推送服务用作代理,即只要发布者准备好推送数据,他们就会将其推送到此服务,然后代理将数据广播传送给所有订阅者。

2)您可以在单独的JVM上创建JMS队列,使发布者和订阅者听取此服务。将此JVM服务用作代理。

您还可以将此服务用于其他目的,例如保护消息,维护会话,存储消息,以便在预期接收者无法接收消息时将来发送。

然而,使用该模型的缺点是它会为您的应用程序设置增加一个维护开销。

答案 1 :(得分:2)

我建议使用数据库作为同步点 想象一下具有待处理消息的单个数据库表,每个节点定期查询它并仅为其活动客户端选择消息,传递它们并更新表(并插入新接收的消息)。

优点:

  • 易于实施
  • 易于配置(每个节点上的数据源相同)
  • 超级可扩展
  • 不会成为基础设施的噩梦
  • 易于监控
  • 事务性(与某些群集范围的缓存相对)

唯一的复杂因素是你必须想出一个好的策略来决定何时查询,以免过度分配数据库;例如,您可以使用单个JMS主题向其他节点发出新消息到达的信号 我知道它看起来并不像使用异步消息传递那样花哨,但要考虑一下!

答案 2 :(得分:2)

最简单的方法可能是使用内置的集群通信系统,通过这样做,您将保持水平可扩展:

https://docs.jboss.org/author/display/WFLY8/HTTP+Services

http://www.jgroups.org/tutorial/html/ch02.html

如果当前节点上没有消息目标连接,只需将其转发到群集的所有其他节点,管理良好连接的节点将推送它,其他节点将忽略。

我从来没有使用过这种功能,我想网络必须支持组播。

相关问题