服务器无法响应同一会话的更多请求

时间:2018-07-16 12:27:21

标签: spring-boot server-sent-events spring-webflux project-reactor

我在下面有事件流代码块:

    @RequestMapping(value = "/stream/{columnId}/data", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @ResponseBody
    public Flux<Activity> streamingData(@PathVariable String columnId, HttpSession httpSession) {
        try {
            ColumnObject columnObject = streamHelper.findColumnObjectInListById(columnId);
            return streamHelper.getStreamData(httpSession.getId(), columnObject);
        } catch (Exception e) {
            ...
        }
    }

在通过端点创建6列之后,spring服务器会将所有后续请求置于未决状态。

(例如,获取,发布方法)

@RequestMapping(value = "/session/metrics", method = RequestMethod.GET)
    public ResponseEntity<?> keepSessionAliveMetrics(HttpSession httpSession) {
        return new ResponseEntity<Void>(HttpStatus.OK); // STATE ONLY PENDING 
    }

enter image description here

3 个答案:

答案 0 :(得分:0)

如Marten Deinum所指出的那样,这是一个典型的硬限制:浏览器倾向于限制到给定域的并发连接数。

如果您的应用程序需要大量的多路复用,也许使用WebSockets是更好的选择,因为在单个TCP连接上建立了许多消息通道。

答案 1 :(得分:0)

要绕过浏览器的这种限制,您可以通过HTTP / 2使用服务器发送的事件:HTTP / 2提供了一种多路复用功能,可以绕开此HTTP / 1问题。 有一篇很棒的文章:method set

SpringBoot支持HTTP / 2,但可能不是Spring WebFlux(至少在撰写本文时,是Netty):https://www.smashingmagazine.com/2018/02/sse-websockets-data-flow-http2/

答案 2 :(得分:0)

通过HTTP / 2使用SSE无疑是克服您遇到的限制的最佳方法。您可以在这里找到更多详细信息:https://www.infoq.com/articles/websocket-and-http2-coexist