来自 UI 的 Websocket 连接到 Spring Boot 应用程序的实例之一,用于流式传输队列中的数据

Posted

技术标签:

【中文标题】来自 UI 的 Websocket 连接到 Spring Boot 应用程序的实例之一,用于流式传输队列中的数据【英文标题】:Websocket from UI connecting to one of the instances for Spring boot application for streaming the data coming on a queue 【发布时间】:2021-05-16 23:12:20 【问题描述】:

我有一个 UI 应用程序(显示流),它与 Spring Boot 微服务(多个 JVM)建立 WebSocket 连接,该服务将请求转发到上游服务器之一,并监听来自上游的 JMS 队列上的响应服务器,然后必须将响应消息返回到套接字。

我们面临的问题是,由于套接字是点对点的,并且 Spring Boot 应用程序在多个实例上运行,这些实例都在侦听同一个 JMS 队列,当消息发送时,我们无法将数据返回给 WebSocket在未向上游发出请求的实例上收到。

这是基本流程:

WebSocket -> instance1, instance2, instance3 -> Data provider
Instance1 向数据提供者发出了请求。 数据提供者将数据发送回队列 实例 3 收到消息,但是它没有套接字连接来发回数据。

我们有一个临时解决方案,在 JMS 标头和队列上的选择器中使用关联 ID,但是现在数据发布者无法提供依赖的关联 ID。

有没有人有更好的建议来解决这个问题?

【问题讨论】:

【参考方案1】:

由于您在 JMS 中使用请求/回复模式,因此您必须使用相关 ID 唯一的临时队列来响应。

您表示,“数据发布者无法提供依赖的关联 ID。”但是,您的 应用程序实际上提供了相关 ID。在这种情况下,“数据提供者”只需要从它接收到的消息中取出并放入响应消息中。该过程只需要“数据提供者”调用 2 个方法 - javax.jms.Message.getJMSCorrelationIDjavax.jms.Message.setJMSCorrelationID

如果“数据提供者”不能做到这一点,那么他们能否完成另一个选择,即使用唯一的临时队列进行响应是值得怀疑的。但是,无论如何都值得解释一下。当您的“实例”服务器之一发送请求消息时,它首先需要使用javax.jms.Session.createTemporaryQueue 创建一个临时队列,然后获取该方法的返回参数并使用javax.jms.Message.setJMSReplyTo 在请求消息上设置它。当“数据提供者”收到消息时,他们将使用javax.jms.Message.getJMSReplyTo 获取该值,然后将响应发送到该队列,“实例”将在该队列中检索它。

这是使用 JMS 实现请求/响应模式的两种普遍接受的方式。我不知道有任何其他方法可以实现这种模式。

【讨论】:

以上是关于来自 UI 的 Websocket 连接到 Spring Boot 应用程序的实例之一,用于流式传输队列中的数据的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 连接到 Websocket - 等待来自服务器的信号

使用 websocketpp 库连接到 c++ websocket 服务器

Spring WebSocket 使用 SockJS 连接到不同的域

通过 websocket 的彗星:“未知的巴约传输”

无法连接到 websocket

actioncable 无法连接到 websocket