2014-05-23 55 views
8

我们正在开发一个应用程序,其中将包含一些基本的聊天/消息传递功能。 Web应用程序部署在Wildfly 8.x上,并使用标准的JavaEE 7库(与Spring之类的其他应用程序框架相反)我们利用Websockets完成此任务,因为我们需要推送到浏览器的功能提供。但是,我们正在将此Web应用程序部署在集群/ HA配置中。如果UserA连接到NodeA并传递一条指向连接到NodeB的UserB的消息,那么如何传输此消息?Wildfly - 单独节点上的2个Websocket之间的通信?

在单节点配置中,简单的答案是维持一个静态的MapList具有所有的WebSockets和会话,和路由的基于所述消息目的地的适当的WebSocket。但是,有多个节点显然不能工作,因为静态的每个JVM都是静态的。

我们将如何去完成这个目标?是否有可能使用JMS并让每个WebSocket充当JMS侦听器?这会对资源利用率或可伸缩性和性能产生什么影响?

我们对如何解决这个问题感到有点不知所措,并且非常感谢您提供的任何建议。

回答

3

您可以通过两种方式

1)您可以创建不同的Web服务器上的一个单独的推送服务,使出版商和用户收听该服务做到这一点。使用这种推送服务作为代理,即每当发布者准备好推送数据时,他们会将其推送到此服务,然后代理将数据广播传送给所有订阅者。

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

您也可以将此服务用于其他目的,例如保护邮件,维护会话,存储邮件以供将来传送,当预期的接收方不可用于接收邮件时。

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

2

我建议使用数据库作为同步点。假设有一个带有未决消息的数据库表,每个节点定期查询它,只为其活动客户端选择消息,发送它们并更新表(并插入新接收的消息)。

优点:

  • 容易实现
  • 易于配置(每个节点上的同一数据源)
  • 快速
  • 超级可扩展
  • 将不再是一个基础设施的噩梦
  • 易于监测
  • 交易(相对于s ome集群缓存)

唯一的复杂情况是,你必须拿出一个好的策略来决定何时查询,以免过度饱和数据库;例如,您可以使用单个JMS主题向其他节点发送新消息到达。
我知道它看起来并不像仅仅使用异步消息那样花哨,但给它一个想法!

+0

不确定它会如此之快...... – Gab

+0

+1为简单起见;) – Gab

+0

尽管这样做会起作用,但性能和可伸缩性会非常糟糕。更不用说它将需要不断地轮询数据库以获取新消息。 – Shadowman

2

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

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

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

,如果您还没有消息目的地连接在当前节点上,只是将其转发给群集中的所有其他节点,管理良好连接的节点将推送它,其他节点将忽略。

无论如何,我从来没有使用这种功能,我想组播必须由网络支持。