Cloudflare anunció la disponibilidad general del soporte de MySQL en Hyperdrive, un servicio dirigido a los usuarios de Workers para agrupar conexiones de bases de datos y reutilizarlas a través de la red de la empresa. El paso de la versión beta a la disponibilidad general se produjo después de corregir alrededor de 20 fallos, entre ellos un problema poco frecuente en la caché de los resultados de las consultas que provocaba respuestas vacías pese a que se esperaba que hubiera datos.
El problema aparecía aproximadamente en el 0,001 % de los casos, lo que dificultaba detectarlo mediante los registros de seguimiento. Cloudflare descubrió que el fallo solo aparecía cuando la caché estaba activada, después de que lo notificara el cliente que más utilizaba el servicio de MySQL durante la fase beta.
¿Cómo funciona Hyperdrive?
Hyperdrive mantiene conexiones SQL activas y abiertas en la red de Cloudflare y las comparte entre las solicitudes de Workers, en lugar de crear una conexión nueva para cada solicitud. También puede almacenar los resultados de las consultas frecuentes en la memoria caché local de la CDN, lo que reduce la latencia y la presión sobre la base de datos de origen.
La arquitectura del servicio consta de un nodo Client que funciona cerca del Worker y un nodo Endpoint que gestiona la agrupación de conexiones y se encuentra en un centro de datos cercano a la base de datos de origen. Ambos nodos pueden compartir la misma caché cuando funcionan en el mismo centro de datos.
El fallo estaba en una diferencia en el formato del protocolo de MySQL
Hyperdrive interactúa con MySQL desde dos lados diferentes: funciona como servidor frente al Worker y como cliente frente a la base de datos de origen. Como las capacidades del protocolo que negocia el Worker pueden diferir de las capacidades que Hyperdrive utiliza con la base de datos, el servicio debe reformular los mensajes de resultados para adaptarlos al cliente final.
La investigación se centró en la forma de finalizar los conjuntos de resultados. Algunas bibliotecas de MySQL, incluida la popular biblioteca mysql2 de Node.js, no admiten la capacidad CLIENT_DEPRECATE_EOF. Cuando esta capacidad no está presente, el servidor utiliza paquetes EOF, mientras que el comportamiento del protocolo más reciente los sustituye por un paquete OK al final de un conjunto de resultados.
En ocasiones, el nodo Client almacenaba los bytes después de traducirlos para adaptarlos a las capacidades del Worker, mientras que el nodo Endpoint esperaba una versión canónica con las capacidades de Hyperdrive. Cuando uno de los nodos leía un resultado almacenado por el otro, podía interpretar los mensajes con un formato inadecuado, lo que provocaba un EOF prematuro, un bloqueo o un resultado vacío.
¿Qué cambió en la práctica?
Cloudflare corrigió el problema haciendo que todos los nodos escribieran en la caché una versión canónica del resultado de la consulta, codificada siempre según las capacidades de Hyperdrive, independientemente del nodo que la hubiera almacenado. Tras implementar la corrección, desapareció el problema de las filas vacías y la tasa de éxito de las conexiones de Client alcanzó el 99,99 %, según Cloudflare.
La empresa también solucionó otros problemas detectados durante las pruebas, incluido un error en la codificación de emojis. El uso de utf8 apuntaba en la práctica a utf8mb3, que no admite todos los puntos de código Unicode de cuatro bytes. El servicio pasó a utilizar utf8mb4. Asimismo, restablecía la codificación después de ejecutar el comando COM_RESET_CONNECTION, porque este comando devuelve la conexión a la configuración predeterminada del servidor, que puede ser latin1.
Disponibilidad y limitaciones
El soporte de MySQL ya está disponible de forma general a través del panel de Cloudflare o de la herramienta wrangler, y puede utilizarse con bases de datos MySQL compatibles, incluida la conexión a una nueva base de datos de PlanetScale. El caso demuestra que la agrupación de conexiones y el almacenamiento en caché en una capa intermedia no dependen únicamente de la corrección de SQL, sino que también requieren una coincidencia precisa entre los estados del protocolo y el formato que espera cada capa.