我们正在开发一个应用程序,它将包含一些基本的聊天/消息传递功能。web应用程序部署在Wildfli8.x上,并使用标准的JavaEE 7库(而不是像Spring这样的附加应用程序框架),我们利用Websockets来实现这一点,因为我们需要它提供的推送到浏览器的功能。但是,我们正在集群/HA配置中部署这个web应用程序。如果UserA连接到NodeA并传入一条以UserB连接到NodeB的消息,我们如何传输该消息?
在单节点配置中,简单的解决方案是维护具有所有Websocket和会话的静态Map或List,并根据消息目的地将其路由到适当的Websocket。但是,多个节点显然不能工作,因为静态Map/List是每个JVM。
我们将如何实现这一目标?是否可以使用JMS并让每个Websocket充当JMS侦听器?这将对资源利用或可伸缩性和性能产生什么影响?
对于如何解决这个问题,我们有些不知所措,非常感谢你能给我们的任何建议。
发布于 2014-05-27 12:18:35
你可以用两种方式做这件事
1)您可以在不同的web服务器上创建单独的推送服务,让发布者和订阅者收听此服务。使用此push服务作为代理,也就是说,每当publisher准备好将数据推送到此服务时,代理就会将数据广播发送给所有订阅者。
2)您可以在独立的JVM上创建JMS队列,让发布者和订阅者监听此服务。使用此JVM服务作为代理。
您还可以将此服务用于其他目的,如保护消息、维护会话、存储消息以供将来传递时,如果预期接收方无法接收这些消息。
然而,使用该模型的缺点是,它将为应用程序设置增加一次维护开销。
发布于 2014-05-27 13:32:56
我建议使用数据库作为同步点。
假设有一个带有挂起消息的DB表,每个节点定期查询它,并且只为其活动客户端选择消息,传递它们并更新表(并插入新接收的消息)。
优势:
唯一的复杂之处在于,您必须想出一个很好的策略来决定何时进行查询,这样就不会使DB过于饱和;例如,您可以使用单个JMS主题向其他节点发出一个新消息到达的信号。
我知道它看起来不像只使用异步消息来完成它那样花哨,但是请考虑一下!
发布于 2014-05-28 17:41:09
最简单的方法可能是使用内置的集群通信系统,这样,您将保持水平可伸缩性:
https://docs.jboss.org/author/display/WFLY8/HTTP+Services
http://www.jgroups.org/tutorial/html/ch02.html
如果当前节点上没有消息目标连接,只需将其转发到集群的所有其他节点,管理良好连接的节点就会将其推送,其他节点将忽略它。
无论如何,我从来没有使用过这种特性,我认为网络必须支持多播。
https://stackoverflow.com/questions/23832540
复制相似问题