Cloudflare ha pubblicato la versione 0.6 del framework Pingora, progettata per lo sviluppo di servizi di rete ad alte prestazioni e protetti nel linguaggio Rust. Già da oltre due anni, i proxy costruiti con Pingora vengono utilizzati nella rete di distribuzione dei contenuti di Cloudflare al posto di nginx e gestiscono oltre 40 milioni di richieste al secondo. Il codice è scritto in Rust ed è pubblicato sotto la licenza Apache 2.0.
Caratteristiche principali di Pingora:
- Supporto per HTTP/1 e HTTP/2 (in programma HTTP/3), e possibilità di creare servizi che utilizzano i propri protocolli o UDP/TCP.
- Supporto per l'elaborazione multithreading delle richieste in modalità asincrona.
- Possibilità di allegare callback e filtri che permettono di gestire le varie fasi dell'elaborazione della richiesta, oltre a modificare, reindirizzare, bloccare e registrare richieste e risposte.
- Proxy per gRPC e WebSocket.
- Bilanciatori di carico plug-in.
- Possibilità di modifica della configurazione senza riavvio.
- Supporto per l'aggiornamento del codice dell'app senza interruzione delle connessioni.
- Strumenti per il failover in caso di guasti.
- Integrazione con vari sistemi di monitoraggio e logging (Syslog, Prometheus, Sentry, OpenTelemetry).
- Supporto per la crittografia TLS (viene utilizzato OpenSSL, BoringSSL o Rustls).
- Pacchetti Rust pronti per la creazione di proxy HTTP, lavorare con protocolli di rete, analizzare gli header HTTP, monitorare e limitare il traffico, bilanciamento del carico, lavorare con tabelle hash distribuite Ketama, mantenere una cache in memoria e gestione asincrona dei timeout.
Tra le novità nella nuova versione:
- Durante la fase di shutdown, è garantito il salvataggio dei nomi dei componenti runtime nel log per semplificare la diagnosi dei problemi causati dalla mancanza di componenti runtime e che conducano a ritardi durante lo spegnimento.
- È stata attivata la tracciatura delle fasi di esecuzione server, le cui informazioni possono essere utili per il monitoraggio o per garantire la resilienza. Quando cambia la fase di esecuzione, viene generato un messaggio ExecutionPhase, che può essere intercettato tramite l'API Server::watch_execution_phase.
- È consentito l'allocazione in memoria di dizionari compressi.
- Nell'implementazione del server http e del proxy http sono state aggiunte le direttive HttpServerOptions e H2Options.
- È stata implementata la protezione contro l'attacco MadeYouReset, che consente di causare un'interruzione del servizio tramite la manipolazione dei frame di controllo HTTP/2.
Fonte: opennet.ru
