Firma Cloudflare opublikowała wersję 0.7 frameworka Pingora, przeznaczonego do tworzenia zabezpieczonych, wysokowydajnych usług sieciowych w języku Rust. Proxy zbudowane za pomocą Pingora jest już od ponad dwóch lat używane w sieci dostarczania treści Cloudflare, zastępując nginx i obsługując ponad 40 milionów zapytań na sekundę. Kod jest napisany w języku Rust i udostępniony na licencji Apache 2.0.
Główne możliwości Pingora:
- Wsparcie dla HTTP/1 i HTTP/2 (w planach HTTP/3), a także możliwość tworzenia usług korzystających z własnych protokołów lub UDP/TCP.
- Wsparcie dla wielowątkowego przetwarzania zapytań w trybie asynchronicznym.
- Możliwość dołączania callbacków i filtrów umożliwiających zarządzanie różnymi etapami przetwarzania zapytania, a także modyfikowanie, przekierowywanie, blokowanie i logowanie zapytań i odpowiedzi.
- Proxy gRPC i WebSocket.
- Modułowe load balancery.
- Możliwość zmiany konfiguracji bez restartu.
- Wsparcie dla aktualizacji kodu aplikacji bez przerywania połączeń.
- Narzędzia do przełączania obciążenia w przypadku awarii (failover).
- Integracja z różnymi systemami monitorującymi i logującymi (Syslog, Prometheus, Sentry, OpenTelemetry).
- Wsparcie dla szyfrowania TLS (wykorzystuje OpenSSL, BoringSSL lub Rustls).
- Gotowe pakiety Rust do tworzenia proxy HTTP, pracy z protokołami sieciowymi, analizy nagłówków HTTP, zliczania i ograniczania ruchu, balansowania obciążenia, pracy z rozproszoną tablicą haszującą Ketama, utrzymywania pamięci podręcznej w pamięci RAM i asynchronicznego przetwarzania czasów oczekiwania.
Wśród zmian w nowej wersji:
- Struktura SslDigest została wzbogacona o pole "extension", a dla typu TlsAccept zaimplementowano handler handshake_complete_callback, co pozwala na dołączanie do połączenia TLS dowolnych danych specyficznych dla aplikacji. Jako przykład zilustrowano, jak wykorzystać tę funkcję do tworzenia serwera, odczytującego informacje z certyfikatu klienta i zwracającego je w odpowiedzi HTTP.
- Dodano typ ConnectionFilter do filtrowania połączeń TCP na etapie przed negocjacją parametrów TLS, co pozwala zaoszczędzić zasoby poprzez zrywanie połączeń na wczesnym etapie.
- Dodano wsparcie dla wirtualnych strumieni na poziomie transportu (Virtual L4 Streams), co umożliwia integrację własnych implementacji protokołów sieciowych w pingora-proxy.
- Zrealizowano możliwość wykorzystania opcji verify_cert i verify_hostname w konfiguracjach z rustls.
- Dla zewnętrznych paczek crate pozwolono na dostęp do struktury HttpProxy w celu nadpisania logiki proxyzowania zapytań.
- Zezwolono na wydzielenie asynchronicznych handlerów podzapytań z głównego handlera sesji.
- Udostępniono możliwość śledzenia rozmiaru ciał zapytań HTTP1 i HTTP2, a także metryk działania proxy.
- Dodano możliwość tworzenia własnych sesji dla zainkapsołowanego ruchu HTTP.
- Nałożono ograniczenia dotyczące użycia wersji biblioteki lru (0.16.3 lub nowszej) z powodu luki w implementacji iteratora IterMut, prowadzącej do nieprzewidywalnych zakończeń spowodowanych działaniem kontroli pożyczania zmiennych (borrow checker).
Źródło: opennet.ru
