La empresa Cloudflare ha lanzado la versión 0.7 del marco de trabajo Pingora, diseñado para el desarrollo de servicios de red seguros y de alto rendimiento en el lenguaje Rust. Desde hace más de dos años, el proxy construido con Pingora se utiliza en la red de entrega de contenido de Cloudflare en lugar de nginx, manejando más de 40 millones de solicitudes por segundo. El código está escrito en Rust y se publica bajo la licencia Apache 2.0.
Funciones principales de Pingora:
- Soporte para HTTP/1 y HTTP/2 (planeando HTTP/3), así como la capacidad de crear servicios que utilicen sus propios protocolos o UDP/TCP.
- Soporte para el procesamiento multihilo de solicitudes de manera asincrónica.
- Capacidad para adjuntar manejadores de callback y filtros que permiten gestionar diversas etapas del procesamiento de solicitudes, así como modificar, redirigir, bloquear y registrar solicitudes y respuestas.
- Proxy para gRPC y WebSocket.
- Balanceadores de carga plug-in.
- Posibilidad de cambiar la configuración sin reiniciar.
- Soporte para la actualización del código de la aplicación sin interrumpir las conexiones.
- Herramientas para la conmutación por error (failover) en caso de fallo.
- Integración con diversos sistemas de monitoreo y registro (Syslog, Prometheus, Sentry, OpenTelemetry).
- Soporte para cifrado TLS (utilizando OpenSSL, BoringSSL o Rustls).
- Paquetes de Rust listos para crear proxies HTTP, trabajar con protocolos de red, analizar encabezados HTTP, contabilizar y limitar el tráfico, balancear carga, trabajar con tableros hash distribuidos Ketama, mantener caché en memoria y procesamiento asíncrono de timeouts.
Entre los cambios en la nueva versión:
- Se agregó un campo ‘extension’ a la estructura SslDigest, y para la interfaz TlsAccept se implementó un manejador handshake_complete_callback que permite adjuntar datos arbitrarios específicos de la aplicación a la conexión TLS. Como ejemplo, se muestra cómo utilizar esta capacidad para crear servidores, que lee información del certificado del cliente y la devuelve en la respuesta HTTP.
- Se añadió la interfaz ConnectionFilter para filtrar conexiones TCP en la etapa previa al acuerdo de parámetros TLS, lo que permite ahorrar recursos al cerrar conexiones en una etapa temprana.
- Se añadió soporte para flujos virtuales de nivel de transporte (Virtual L4 Streams), lo que permite integrar implementaciones propias de protocolos de red en el pingora-proxy.
- Se implementó la posibilidad de usar las opciones verify_cert y verify_hostname en configuraciones con rustls.
- Se permite el acceso a la estructura HttpProxy para redefinir la lógica de proxy de solicitudes para paquetes externos de crate.
- Se permite la dedicación de manejadores de fondo de subsolicitudes desde el manejador principal de sesión.
- Se ha proporcionado la capacidad de rastrear el tamaño del cuerpo de las solicitudes HTTP1 y HTTP2, así como métricas del rendimiento del proxy.
- Se ha añadido la posibilidad de crear sesiones propias para el tráfico HTTP encapsulado.
- Se han impuesto restricciones sobre el uso de versiones de la biblioteca lru (0.16.3 o más recientes) debido a una vulnerabilidad en la implementación del iterador IterMut, que puede provocar fallos debido a la activación del verificador de préstamos (borrow checker).
Fuente: opennet.ru
