Optimización de reutilización de conexiones HTTP/1 en Go

Fuentes: Optimizing HTTP/1 connection reuse in Go

El rendimiento de las aplicaciones en Go ha mejorado significativamente en la versión 1.27 gracias a una optimización interna de la reutilización de conexiones HTTP/1. En Go 1.26, una función simple que realizaba 100 peticiones GET a index.golang.org tardaba aproximadamente 710 milisegundos, mientras que en la versión 1.27 el mismo proceso se completaba en unos 150 milisegundos, una mejora de casi cinco veces. Esta diferencia se debe a que la librería net/http ahora gestiona mejor el estado de los cuerpos de respuesta no leídos, permitiendo reutilizar la conexión TCP sin incurrir en el coste de establecer nuevas conexiones TLS y TCP para cada solicitud.

El problema radica en que, en HTTP/1, las respuestas se envían secuencialmente en el mismo flujo de bytes. Si el código no lee el cuerpo completo de la respuesta antes de cerrarlo, la librería detecta datos no leídos y abandona la conexión, forzando la creación de una nueva. Esto es particularmente problemático en APIs que envían cuerpos de datos adicionales, como mensajes de error o detalles de estado, que el cliente no necesita. La solución manual tradicional implicaba drenar el cuerpo de la respuesta antes de cerrarlo, pero esto podía ser ineficiente si el cuerpo era grande o lento. La nueva implementación en Go 1.27 resuelve este problema de forma transparente, eliminando la necesidad de código adicional para gestionar el drenaje de cuerpos de respuesta y garantizando una reutilización de conexiones más eficiente y robusta.