Jakarta ee Wildfly-两个单独节点上的WebSocket之间的通信?
我们正在开发一个包含一些基本聊天/消息传递功能的应用程序。web应用程序部署在Wildfly 8.x上,并使用标准JavaEE 7库(与Spring等附加应用程序框架相反),我们利用WebSocket来实现这一点,因为我们需要它提供的推送浏览器功能。但是,我们正在集群/HA配置中部署此web应用程序。如果UserA连接到NodeA并传入一条消息,该消息的目的地是连接到NodeB的UserB,我们如何传输该消息 在单节点配置中,简单的答案是维护一个包含所有Websocket和会话的静态Jakarta ee Wildfly-两个单独节点上的WebSocket之间的通信?,jakarta-ee,jboss,websocket,cluster-computing,wildfly,Jakarta Ee,Jboss,Websocket,Cluster Computing,Wildfly,我们正在开发一个包含一些基本聊天/消息传递功能的应用程序。web应用程序部署在Wildfly 8.x上,并使用标准JavaEE 7库(与Spring等附加应用程序框架相反),我们利用WebSocket来实现这一点,因为我们需要它提供的推送浏览器功能。但是,我们正在集群/HA配置中部署此web应用程序。如果UserA连接到NodeA并传入一条消息,该消息的目的地是连接到NodeB的UserB,我们如何传输该消息 在单节点配置中,简单的答案是维护一个包含所有Websocket和会话的静态映射或列表,
映射
或列表
,并根据消息目的地路由到相应的Websocket。但是,有多个节点显然无法工作,因为静态映射
/列表
是每个JVM的
我们将如何实现这一目标?是否可以使用JMS并让每个Websocket充当JMS侦听器?这会对资源利用率、可伸缩性和性能产生什么影响
对于如何解决这个问题,我们有点不知所措,非常感谢您提供的任何建议。您可以通过两种方式来解决 1) 您可以在不同的web服务器上创建单独的推送服务,使发布者和订阅者侦听此服务。将此推送服务用作代理,也就是说,每当publisher准备好要推送的数据时,他们都会将数据推送到此服务,然后代理将数据广播到所有订阅者 2) 您可以在单独的JVM上创建JMS队列,使发布者和订阅者侦听此服务。将此JVM服务用作代理 您还可以将此服务用于其他目的,如保护消息安全、维护会话、存储消息以备将来在预期接收者无法接收消息时发送
但是,使用该模型的缺点是会给应用程序设置增加一个额外的维护开销。我建议使用数据库作为同步点。
设想一个具有挂起消息的DB表,每个节点定期查询该表,并仅为其活动客户端拾取消息,传递消息并更新该表(并插入新接收的消息) 优点:
- 易于实现
- 易于配置(每个节点上的数据源相同)
- 快速
- 超级可扩展
- 不会是基础设施的噩梦
- 易于监控
- 事务性(与某些集群范围的缓存相反)
我知道这看起来不像只使用异步消息传递那么花哨,但请考虑一下 最简单的方法可能是使用内置集群通信系统,这样,您将保持水平可伸缩性: 如果当前节点上没有消息目的地连接,只需将其转发到集群的所有其他节点,管理良好连接的节点将推送消息目的地连接,其他节点将忽略消息目的地连接
我从来没有使用过这种功能,我想网络必须支持多播 虽然这样做可行,但性能和可伸缩性将非常糟糕。更不用说它需要不断轮询DB以获取新消息了。我曾经在一个类似设置的项目中工作过:6个集群节点中的每个节点每秒轮询DB两次;DB性能根本不是问题。注意,它不是在高端硬件上。此外,使用这种方法,添加延迟传递和多对多通信会更容易。此外,如果您设置jms主题以避免db轮询,为什么不直接将聊天消息发送到jms以代替通知?通知可以是第100条消息,也可以是超时消息,或者以先到者为准。我反对每一条聊天信息都有一条JMS消息。这可能会产生大量JMS消息;更不用说,如果交易是在网上,则每条消息将有2条。但只要到DB来回一次,你就可以取回所有的东西;峰值负荷更容易预测。