Společnost Cloudflare vydala verzi frameworku Pingora 0.7, určeného pro vývoj zabezpečených vysoce výkonných síťových služeb v jazyce Rust. Proxy postavená pomocí Pingora již více než dva roky používá síť pro doručování obsahu Cloudflare místo nginx a zpracovává více než 40 milionů požadavků za sekundu. Kód je napsán v jazyce Rust a publikován pod licencí Apache 2.0.
Hlavní funkce Pingora:
- Podpora HTTP/1 a HTTP/2 (v plánech je HTTP/3), stejně jako možnost vytváření služeb, které používají své vlastní protokoly nebo UDP/TCP.
- Podpora vícetrhu zpracování požadavků v asynchronním režimu.
- Možnost připojení callback-handlerů a filtrů, které umožňují řídit různé fáze zpracování požadavku, stejně jako měnit, přesměrovávat, blokovat a logovat požadavky a odpovědi.
- Proxování gRPC a WebSocket.
- Připojitelné vyvažovače zátěže.
- Možnost změny konfigurace bez restartu.
- Podpora aktualizace kódu aplikace bez přerušení spojení.
- Nástroje pro přepínání zátěže v případě selhání (failover).
- Integrace s různými monitorovacími a logovacími systémy (Syslog, Prometheus, Sentry, OpenTelemetry).
- Podpora šifrování TLS (využívá se OpenSSL, BoringSSL nebo Rustls).
- Hotové Rust balíčky pro vytváření HTTP-proxy, práci se síťovými protokoly, zpracování HTTP hlaviček, sledování a omezení provozu, vyvažování zátěže, práci s distribuovanou hash tabulkou Ketama, udržování cache v operační paměti a asynchronní zpracování časových limitů.
Mezi změnami v nové verzi:
- Do struktury SslDigest bylo přidáno pole «extension» a pro typ TlsAccept byl implementován zpracovatel handshake_complete_callback, což umožňuje připojit k TLS připojení libovolná data specifická pro aplikaci. Jako příklad je uvedeno, jak tuto funkci využít pro vytvoření serveru, která čte informace z certifikátu klienta a vrací je v odpovědi HTTP.
- Byl přidán typ ConnectionFilter pro filtrování TCP připojení ve fázi před dohodou parametrů TLS, což šetří zdroje tím, že ukončuje připojení v rané fázi.
- Byla přidána podpora virtuálních toků transportní úrovně (Virtual L4 Streams), která umožňuje integrovat vlastní implementace síťových protokolů do pingora-proxy.
- Byla implementována možnost použití možností verify_cert a verify_hostname v konfiguracích s rustls.
- Pro externí crate balíčky byl povolen přístup ke struktuře HttpProxy pro přepsání logiky zpracování požadavků.
- Bylo umožněno vyčlenění pozadí zpracovatelů subpožadavků z hlavního zpracovatele relace.
- Byla poskytnuta možnost sledovat velikost těla požadavků HTTP1 a HTTP2, stejně jako metriky výkonu proxy.
- Byla přidána možnost vytvářet vlastní relace pro encapsulovaný HTTP provoz.
- Byla stanovena omezení na používání verzí knihovny lru (0.16.3 nebo novější) kvůli zranitelnosti v implementaci iterátoru IterMut, což vedlo k havárii v důsledku selhání kontroly zařazování proměnných (borrow checker).
Zdroj: opennet.ru
