La société Cloudflare a publié le framework Pingora 0.4, destiné au développement de services réseau sécurisés et haute performance en langage Rust. Depuis plus de deux ans, le proxy construit avec Pingora est utilisé dans le réseau de diffusion de contenu de Cloudflare à la place de nginx et traite plus de 40 millions de requêtes par seconde. Le code est écrit en langage Rust et publié sous la licence Apache 2.0.
Fonctionnalités principales de Pingora :
- Prise en charge de HTTP/1 et HTTP/2 (HTTP/3 prévu), ainsi que la possibilité de créer des services utilisant leurs propres protocoles ou UDP/TCP.
- Prise en charge du traitement multithreading des requêtes en mode asynchrone.
- Possibilité d'attacher des gestionnaires de rappel et des filtres, permettant de gérer différentes étapes du traitement de la requête ainsi que de modifier, rediriger, bloquer et journaliser les requêtes et les réponses.
- Proxy gRPC et WebSocket.
- Load balancers plugables.
- Possibilité de modification de la configuration sans redémarrage.
- Support de mise à jour du code de l'application sans interruption des connexions.
- Outils pour le basculement en cas de défaillance.
- Intégration avec différents systèmes de surveillance et de journalisation (Syslog, Prometheus, Sentry, OpenTelemetry).
- Prise en charge du chiffrement TLS (utilise OpenSSL, BoringSSL ou Rustls).
- Paquets Rust prêts à l'emploi pour créer des proxy HTTP, travailler avec des protocoles réseau, analyser des en-têtes HTTP, comptabiliser et limiter le trafic, équilibrer la charge, gérer une table de hachage distribuée Ketama, maintenir un cache en mémoire et traiter les délais d'attente de manière asynchrone.
Parmi les changements dans la nouvelle version :
- Support initial de la bibliothèque cryptographique Rustls, utilisant des fournisseurs cryptographiques basés sur les bibliothèques aws-lc-rs et ring, basées sur BoringSSL.
- Support expérimental de la plateforme Windows.
- Mode de TLS fictif (dummy TLS), qui peut être utilisé dans des situations où il n'est pas possible d'utiliser une véritable implémentation de TLS.
- Ajout de la prise en charge du module gRPC-web pour traduire les requêtes des clients gRPC-web en requêtes à serveur gRPC.
- Fournit la possibilité de traiter des connexions H2C (HTTP/2 sur TCP nu, sans chiffrement) et HTTP/1 sur un même port réseau.
- Ajout de la possibilité de connecter des réalisations personnalisées de la fonction connect() pour modifier le comportement lors de l'établissement de la connexion réseau, par exemple, pour définir des options supplémentaires pour la socket ou simuler des erreurs lors des tests.
- Fournit la possibilité d'ignorer les réponses informatives lors du proxying, telles que les réponses avec l'en-tête « Expect: 100-continue ».
- Ajout de la prise en charge du déballage des réponses compressées par gzip.
- Mise en œuvre du suivi de l'état du backend à des fins de surveillance.
- Ajout de la possibilité de se lier à une plage de ports locaux.
Source : opennet.ru
