Das Unternehmen Cloudflare hat die Version 0.4 des Pingora-Frameworks veröffentlicht, das für die Entwicklung sicherer, leistungsstarker Netzwerkservices in Rust vorgesehen ist. Proxys, die mit Pingora erstellt wurden, werden seit mehr als zwei Jahren im Content Delivery Network von Cloudflare anstelle von nginx verwendet und verarbeiten über 40 Millionen Anfragen pro Sekunde. Der Code ist in Rust geschrieben und unter der Apache 2.0-Lizenz veröffentlicht.
Die Hauptfunktionen von Pingora:
- Unterstützung von HTTP/1 und HTTP/2 (geplant ist HTTP/3) sowie die Möglichkeit, Dienste zu erstellen, die eigene Protokolle oder UDP/TCP verwenden.
- Unterstützung der mehrsträngigen Verarbeitung von Anfragen im asynchronen Modus.
- Die Möglichkeit, Callback-Handler und Filter anzuhängen, die verschiedene Phasen der Anfrageverarbeitung steuern sowie Anfragen und Antworten ändern, umleiten, blockieren und protokollieren können.
- Proxying von gRPC und WebSocket.
- Erweiterbare Lastenausgleicher.
- Die Möglichkeit, Konfigurationen ohne Neustart zu ändern.
- Unterstützung der Aktualisierung des Anwendungscodes ohne Unterbrechung von Verbindungen.
- Mittel zur Lastumschaltung im Falle eines Ausfalls (Failover).
- Integration mit verschiedenen Überwachungs- und Protokollierungssystemen (Syslog, Prometheus, Sentry, OpenTelemetry).
- Unterstützung der TLS-Verschlüsselung (verwendet OpenSSL, BoringSSL oder Rustls).
- Fertige Rust-Pakete zur Erstellung von HTTP-Proxys, zum Arbeiten mit Netzwerkprotokollen, zur Analyse von HTTP-Headern, zur Überwachung und Begrenzung des Verkehrs, zur Lastverteilung, zur Verwendung von verteilten Hash-Tabellen (Ketama), zur Speicherung von Caches im Arbeitsspeicher und zur asynchronen Bearbeitung von Timeouts.
Zu den Änderungen in der neuen Version gehören:
- Erste Unterstützung für die Kryptobibliothek Rustls, die Kryptodienste nutzt, die auf den Bibliotheken aws-lc-rs und ring basieren, die auf BoringSSL beruhen.
- Experimentelle Unterstützung für die Windows-Plattform.
- Dummy-TLS-Modus, der in Situationen verwendet werden kann, in denen eine echte TLS-Implementierung nicht möglich ist.
- Unterstützung des gRPC-web-Moduls hinzugefügt, um Anfragen von gRPC-web-Clients in Anfragen an Server gRPC umzuleiten.
- Möglichkeit zur Verarbeitung von H2C-Verbindungen (HTTP/2 über unverschlüsseltes TCP) und HTTP/1 an einem einzigen Netzwerkport bereitgestellt.
- Die Möglichkeit, eigene Implementierungen der Funktion connect() anzuschließen, wurde hinzugefügt, um das Verhalten bei der Herstellung einer Netzwerkverbindung zu ändern, z. B. um zusätzliche Optionen für den Socket festzulegen oder Fehler zu simulieren, während getestet wird.
- Die Möglichkeit, Informationsantworten beim Proxyn zu ignorieren, wie Antworten mit dem Header „Expect: 100-continue“, wurde bereitgestellt.
- Die Unterstützung zum Entpacken von Antworten, die mit dem gzip-Verfahren komprimiert wurden, wurde hinzugefügt.
- Die Berücksichtigung des Backend-Zustands zu Überwachungszwecken wurde implementiert.
- Die Möglichkeit, an einen Bereich von lokalen Ports zu binden, wurde hinzugefügt.
Quelle: opennet.ru
