前两天帮一个做IoT设备管理平台的团队调性能,发现他们每秒发起3000+次HTTP请求,却卡在连接建立阶段——TIME_WAIT堆积到6万+,端口耗尽。一查代码,全是裸socket短链接,没设超时、没重试、没连接池。这哪是通信?这是在给系统挖坑。
很多人以为HTTP/1.1默认长连接(Keep-Alive),其实不然:客户端必须显式声明Connection: keep-alive,服务端也得配合返回同字段。否则,一次请求响应后TCP立刻断开——这就是标准短链接。RFC 7230写得很清楚:‘A server that does not wish to maintain a persistent connection MUST send the "close" connection option in every response.’
更现实的问题是:很多老旧API网关、Nginx配置或CDN节点,会主动忽略Keep-Alive,或者只允许维持5秒。你发10个请求,可能9个都在重复三次握手+四次挥手——实测延迟从12ms飙到86ms(某电商订单查询接口)。

别急着抄asyncio,先搞定基础socket。我常用这套组合拳:
socket.settimeout()比setdefaulttimeout()更可控,避免污染全局;sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0)),强制快速回收(仅限明确不需要FIN等待的场景)。贴一段我压测用的精简版(生产环境请封装成类):
def http_short_req(host, port, path):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.settimeout(3)
sock.connect((host, port))
sock.settimeout(5)
sock.send(f"GET {path} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n".encode())
return sock.recv(4096)
except (socket.timeout, ConnectionRefusedError) as e:
if attempt < 3:
time.sleep(0.1 * (2 ** attempt))
return http_short_req(host, port, path) # 简化版递归
raise e
finally:
sock.close() # 关键!必须确保关闭
⚠️ 注意:别用with socket.socket() as s:自动关闭——异常时可能跳过recv,导致服务端认为连接还活着。
单机扛5000短链接?别信benchmark。实测CentOS 7下,ulimit -n 65535时,实际稳定并发约3200左右(受内核net.ipv4.ip_local_port_range限制)。我的解法很土但管用:
去年帮客户查一个Netty服务OOM,堆dump显示ByteBuf对象占78%内存。原因很讽刺:他们用Bootstrap反复创建新Channel,却忘了channel.closeFuture().sync()后的资源释放。Netty的PooledByteBufAllocator在短链接高频创建销毁时,如果未显式调用release(),直接触发内存池泄漏。解决方案只有两个字:复用。哪怕短链接,也要用EventLoopGroup复用线程,Channel复用则没必要——但ByteBuf必须手动release。
我们团队做过对照测试(1000并发,持续5分钟):
| 指标 | 短链接(带重试) | 长链接(Keep-Alive) |
|---|---|---|
| 平均延迟 | 62ms | 18ms |
| CPU占用 | 38% | 22% |
| 连接失败率 | 0.37% | 0.02% |
结论很实在:长链接快,但容错差——一旦中间网络抖动,整个连接池失效;短链接慢点,但单点故障不影响其他请求。现在我们混合用:核心支付走长链接,日志上报这类非关键流量用短链接+重试。
说到短链接场景,不得不提URL分发这类需求。比如给抖音、微信发卡片,需要把长URL转成短链再嵌入,这时候趣码短链、趣码抖音卡片这类工具确实省事——它们内置了防刷、统计、跳转优化,比自己搭TinyURL靠谱。但要注意:如果你的业务要求毫秒级响应(比如实时竞价广告),这些SaaS服务的DNS解析+HTTPS握手+重定向链路,反而可能增加30~200ms延迟。我们曾用Wireshark抓包对比,自建短链服务平均跳转耗时14ms,而某第三方服务中位数是89ms。
‘连接的本质不是建立,而是如何优雅地结束和重建。’——某云厂商TCP协议栈负责人在QCon分享中说的这句话,我一直记着。
最后送一句大实话:没有银弹。短链接不是过时技术,它在边缘计算、Serverless冷启动、设备心跳上报等场景依然不可替代。关键是——你知道它为什么断,以及断了之后怎么活下来。