基于Swift-NIO的TLS HTTP/2代理每个请求重配pipeline是否正常?
问题解答
1. 该行为完全符合预期
你观察到的每次入站请求都触发Pipeline配置回调、生成不同ObjectIdentifier的Pipeline是Swift-NIO HTTP/2实现的标准设计,不属于异常问题。
你调用的configureCommonHTTPServerPipeline方法的最后一个入参是Stream配置闭包,这个闭包的触发时机就是每个新的HTTP/2 Stream创建时,而HTTP/2协议中每个请求/响应对都会对应一个独立的Stream,所以每次请求都会触发一次这个闭包,为对应Stream创建专属的子Channel和Pipeline。
2. 不会影响HTTP/2多路复用的优势
HTTP/2的多路复用是指同一个TCP连接上可以并行传输多个Stream的帧,这个特性你完全可以正常享用到,这里可以做两个层级的区分:
- 连接级Channel:
childChannelInitializer最外层处理的是对应实际TCP套接字的连接级Channel,TLS handler、HTTP/2连接全局帧处理器都挂载在这个Channel的Pipeline上,你日志里的TLSHandler added to pipeline每个TCP连接只会打印一次,同个客户端的多次请求都会复用同一个连接级Channel,不会重复创建TCP连接。 - 流级子Channel:每个Stream对应的子Channel是纯逻辑抽象,没有绑定实际的网络套接字,创建销毁开销极低,独立的Pipeline是为了隔离不同请求的处理状态,避免互相干扰,完全不影响连接层的复用效率。
3. 验证方式
你可以在childChannelInitializer最外层(添加TLS Handler的位置)打印当前连接级Channel的ObjectIdentifier,会发现同个客户端的多次请求对应的连接级Channel ID完全一致,只有Stream子Channel的ID不同,即可确认HTTP/2多路复用特性正常生效,不存在性能问题。
内容的提问来源于stack exchange,提问作者WilliamVH
相关产品推荐
相关产品推荐

