nghttp2多线程服务器处理客户端多请求异常问题咨询
nghttp2 多线程服务器下HTTP/2连接复用异常问题
最近我在折腾用nghttp2实现RESTful API服务器的时候遇到个头疼的问题,想请教下大家:
我给服务器定义了两个GET接口:
/api/ping:收到请求后立即返回响应/api/wait:需要完成一段耗时处理后才返回结果
服务器配置了4个工作线程,然后用基于nghttp2的客户端先建立好连接,接着按顺序调用/api/wait、/api/ping。结果用Wireshark抓包一看,这两个GET请求居然走了两个完全不同的TCP连接——这完全不符合HTTP/2多路复用的预期啊,明明应该在同一个连接里用不同的流来处理才对。
有没有大佬能帮忙分析下可能的原因?我自己初步想了几个方向,但拿不准:
- 客户端连接管理逻辑问题:会不会客户端在发送
/api/wait之后,没有正确复用已建立的连接,反而不小心触发了新连接的创建?比如代码里是不是在第一个请求后意外关闭了连接,或者没有从连接池里获取已有连接? - 服务器线程模型的绑定限制:nghttp2服务器如果是每个线程绑定一个连接的话,会不会因为
/api/wait占用了当前线程,客户端误以为这个连接暂时不可用,就新建了一个?但HTTP/2本身支持单连接多流,就算一个流在处理耗时任务,其他流应该也能在同一个连接里发送才对呀。 - HTTP/2协商隐性失败:有没有可能第一次连接的ALPN协商出了隐性问题,客户端悄悄fallback到HTTP/1.1了,然后第二个请求又重新协商HTTP/2?我得再去Wireshark里仔细看看两个连接的协议版本是不是都是HTTP/2。
- 服务器流并发配置过低:会不会我把
NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS设得太低了,第一个流占了之后,客户端没法在同一个连接上创建新流,只能新建连接? - 请求属性不满足复用条件:两个请求的
Host头是不是不一样?或者客户端给两个请求设置了不同的连接属性,导致连接复用的条件不满足?
内容的提问来源于stack exchange,提问作者Soumya Kanti
相关产品推荐
相关产品推荐

