Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee Wildfly-两个单独节点上的WebSocket之间的通信?_Jakarta Ee_Jboss_Websocket_Cluster Computing_Wildfly - Fatal编程技术网

Jakarta ee Wildfly-两个单独节点上的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和会话的静态映射或列表,

我们正在开发一个包含一些基本聊天/消息传递功能的应用程序。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表,每个节点定期查询该表,并仅为其活动客户端拾取消息,传递消息并更新该表(并插入新接收的消息)

优点:

  • 易于实现
  • 易于配置(每个节点上的数据源相同)
  • 快速
  • 超级可扩展
  • 不会是基础设施的噩梦
  • 易于监控
  • 事务性(与某些集群范围的缓存相反)
唯一复杂的是,您必须想出一个好的策略来决定何时查询,以避免数据库过度饱和;例如,您可以使用单个JMS主题向其他节点发出新消息到达的信号。

我知道这看起来不像只使用异步消息传递那么花哨,但请考虑一下

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

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


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

虽然这样做可行,但性能和可伸缩性将非常糟糕。更不用说它需要不断轮询DB以获取新消息了。我曾经在一个类似设置的项目中工作过:6个集群节点中的每个节点每秒轮询DB两次;DB性能根本不是问题。注意,它不是在高端硬件上。此外,使用这种方法,添加延迟传递和多对多通信会更容易。此外,如果您设置jms主题以避免db轮询,为什么不直接将聊天消息发送到jms以代替通知?通知可以是第100条消息,也可以是超时消息,或者以先到者为准。我反对每一条聊天信息都有一条JMS消息。这可能会产生大量JMS消息;更不用说,如果交易是在网上,则每条消息将有2条。但只要到DB来回一次,你就可以取回所有的东西;峰值负荷更容易预测。