一场促销背后的崩溃
上周五晚上,某电商平台的秒杀活动刚一开始,服务器就接连报错。运维团队紧急排查,发现并不是CPU或内存撑不住,而是大量请求在建立连接时失败。日志里反复出现protocol not supported和handshake timeout。问题最终定位到一个被忽略的细节:新上线的边缘节点启用了HTTP/2,但部分老客户端还在用只支持HTTP/1.0的SDK。
协议兼容不是配置完就万事大吉
很多团队在升级协议时,只关注功能是否通,比如从HTTP/1.1切换到HTTP/2,测试环境跑通几个接口就认为OK。但在高并发场景下,协议层的细微差异会被放大。例如HTTP/2要求TLS 1.2以上,而某些IoT设备固件停留在旧版本,连接直接被拒。
另一个常见问题是长连接管理。WebSocket在高并发下如果服务端未正确处理协议降级,当网络抖动时,客户端尝试回落到轮询机制,但后端没开放对应路径,结果就是成千上万的设备同时断连重试,形成雪崩。
真实案例:支付网关的教训
某支付网关为了提升性能,将Nginx配置为优先使用HTTP/2。上线后发现部分银行回调失败。排查发现这些银行系统仍在使用Java 6环境,不支持ALPN扩展,无法完成HTTP/2协商。虽然服务器配置了http2 on;,但没有设置回退机制,导致握手失败。
server {
listen 443 ssl;
listen 443 http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 必须保留非http2的监听以兼容旧客户端
location /callback/ {
proxy_pass http://backend;
proxy_http_version 1.1;
}
}
压测时别只盯着QPS
很多压力测试工具默认使用最新协议版本,比如wrk或k6默认走HTTP/1.1或HTTP/2。但线上流量是混合的。应该在压测脚本中模拟不同协议版本的请求比例。例如:
# 使用不同工具组合模拟混合协议流量
# wrk2 发起HTTP/1.1请求
wrk -t10 -c1000 -d30s -H 'Connection: keep-alive' http://api.example.com/v1/data
# h2load 发起纯HTTP/2流量
h2load -n 50000 -c 1000 -m 100 https://api.example.com/v2/data
观察在混合流量下,服务端协议协商耗时是否显著上升,是否有大量连接重建。
CDN与协议兼容的坑
用CDN加速时,很多人以为协议兼容由厂商兜底。实际上,CDN节点可能支持QUIC,但源站未开启UDP监听,结果高并发时大量请求回落到TCP+TLS,反而增加延迟。更麻烦的是,某些CDN在协议转换时会丢弃特定头部,比如Upgrade字段,导致WebSocket升级失败。
建议在接入CDN前,用curl --http2和curl --http1.1分别测试回源行为,确认协议透传是否正常。