【发布时间】:2017-02-17 08:27:45
【问题描述】:
用例
我有一个 tomcat REST 应用程序,它充当它背后的许多其他应用程序的 API 网关。我想为 tomcat 应用程序添加 websocket 支持,以便为每个用户会话发送通知更新。这些通知更新将来自其他应用程序之一,该应用程序没有用户会话上下文,但知道应该向哪个用户发送更新(如果此用户当前有一个打开的会话)。
所以要明确一点 - 我只想要一个 websocket 服务器和一个(或多个)应用程序,它们只生成要发送到用户会话的消息。
我的研究
我很清楚我必须使用带有 STOMP 的full featured broker support 作为子协议。我们已经使用 rabbit 进行通信,所以它是显而易见的选择。
文档指出“STOMP 代理中继还为每个连接的 WebSocket 客户端创建一个单独的 TCP 连接。” 这是每个用户会话的单独连接,而不是每个用户。此外,当发送端位于同一个应用程序(负责处理用户会话的应用程序)中时,每个会话都会创建一个单独的队列。我想我其他想要发送消息的应用程序必须以某种方式知道当前活动的会话并将消息发送到代理的相应队列。
我发现的可能解决方案
Spring Jira 中的这个issue 或多或少与我的问题有关。一种可能的解决方案是实现分布式 UserSessionRegistry。
另一种方法是使用提供的选项作为解决同一问题的方法 - 启用具有未解决的用户目的地的广播消息。但在这种情况下,我所有的应用程序都会收到这些广播消息。而且我只希望前面提到的 API 网关应用程序接收它们(它将是唯一暴露给客户端并打开和关闭用户会话的应用程序)。
那么,解决这个问题的正确方法是什么?
【问题讨论】:
标签: java spring stomp spring-websocket