Flux 响应而不是 WebSocket (Spring boot)

Posted

技术标签:

【中文标题】Flux 响应而不是 WebSocket (Spring boot)【英文标题】:Flux responce instead of WebSocket (Spring boot) 【发布时间】:2019-05-02 18:07:54 【问题描述】:

我正在编写服务,它将在新数据到达我的服务器时将其发送给用户。 所以服务器接收数据,这一切都将交给用户。 为此,我使用了 WebSocket。用户订阅一个主题,然后接收有关新数据的信息。 但是我在 WebFlux 中看到我们可以像在套接字中一样连续返回数据。例如

@GetMapping(value = "/test", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
    public Flux<Object> testStreamOfData() 
        return Flux.generate(() -> "", (state, sink) -> "Hello from reactivness")
                .delayElements(Duration.of(2, ChronoUnit.SECONDS));
    

问题是:我可以用 Flux 实现与 Socket 相同的逻辑吗?

例如,用户将向服务器发出请求,并在新数据到来时返回响应。

【问题讨论】:

【参考方案1】:

您确实可以使用Flux 来通过 Spring WebFlux 流式传输数据。

Spring WebFlux 使用 "application/stream+json 媒体类型流式传输 line-delimited JSON 和 "text/event-stream" 用于服务器发送事件。前者对于服务器到服务器的通信非常有用(您需要一个支持这种格式的客户端),而后者对于服务器到浏览器的通信(浏览器本机支持)非常有用。

因此您可以将数据流式传输到多个客户端,甚至共享同一个源(您应该考虑创建Flux.share() 的单个实例)。

现在我不确定“socket”是指 TCP 套接字还是 socket.io。 TCP 套接字非常低级,如果您正在寻找类似的功能,WebFlux 支持 WebSockets。如果您正在寻找支持订阅的更高级别的传输,例如 STOMP/socket.io,那么 WebFlux 还不支持(Spring Framework 目前正在开发RSocket support)。

如果您正在研究将数据流式传输到浏览器,那么 SSE 是这里的最佳选择(因为 JSON 流不原生支持)。

【讨论】:

以上是关于Flux 响应而不是 WebSocket (Spring boot)的主要内容,如果未能解决你的问题,请参考以下文章

React.js & Flux - 在哪里注册 Websocket 事件(接收数据)的最佳位置

Azure ServiceBusSessionReceiverAsyncClient - Mono 而不是 Flux

SailsJs websocket与自定义路线而不是蓝图?

为啥使用 Redux 而不是 Facebook Flux? [关闭]

让 HTTP 端点返回 Flux/Mono 实例而不是 DTO 的好处 [关闭]

springweb flux 服务器推送事件