【问题标题】:Server cannot respond to more requests for same session服务器无法响应同一会话的更多请求
【发布时间】:2018-12-24 00:02:31
【问题描述】:

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

    @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) {
            ...
        }
    }

通过endpoint创建6列后,spring server会将所有后续请求置于pending状态。

(例如获取、发布方法)

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

【问题讨论】:

  • 这是一个硬浏览器限制。见stackoverflow.com/questions/985431/…。 Spring 在这里什么也没做,它是你的浏览器。
  • 感谢您的评论。我明白。我的朋友@M.Deinum,您如何提出解决方案
  • 修复您的软件/找到不同的方法。浏览器根本无法处理更多请求(甚至每个浏览器都不同)。

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


【解决方案1】:

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

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

【讨论】:

  • 我认为你是对的。我已经在事件流之前使用了 WebSocket。但是一旦你开始使用 Reactor API,事件流就更有意义了。事件流比 websocket 更容易管理。您可以看到上述控制器代码的示例。结果我无法想象会出现这样的问题。
  • Spring WebFlux 也在考虑替代传输,请参阅jira.spring.io/browse/SPR-16751
【解决方案2】:

要绕过浏览器的这个限制,您可以使用 HTTP/2 上的服务器发送事件:HTTP/2 提供了一个多路复用功能,可以绕过这个 HTTP/1 问题。 有一篇很棒的文章:https://www.smashingmagazine.com/2018/02/sse-websockets-data-flow-http2/

SpringBoot 支持 HTTP/2,但可能不是 Spring WebFlux(至少在撰写本文时使用 Netty):https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-http2

【讨论】:

  • 是的,我一直在寻找你在说什么。我认为唯一的解决方案是解决软件。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2010-11-25
    • 2020-04-20
    相关资源
    最近更新 更多