Выпуск Pingora 0.7, фреймворка для создания сетевых сервисов

Компания Cloudflare опубликовала выпуск фреймворка Pingora 0.7, предназначенного для разработки защищённых высокопроизводительных сетевых сервисов на языке Rust. Построенный при помощи Pingora прокси уже более двух лет используется в сети доставки контента Cloudflare вместо nginx и обрабатывает более 40 млн запросов в секунду. Код написан на языке Rust и опубликован под лицензией Apache 2.0.

Основные возможности Pingora:

  • Поддержка HTTP/1 и HTTP/2 (в планах HTTP/3), а также возможность создания сервисов, использующих свои протоколы или UDP/TCP.
  • Поддержка многопоточной обработки запросов в асинхронном режиме.
  • Возможность прикрепления callback-обработчиков и фильтров, позволяющих управлять различными стадиями обработки запроса, а также изменять, перенаправлять, блокировать и журналировать запросы и ответы.
  • Проксирование gRPC и WebSocket.
  • Подключаемые балансировщики нагрузки.
  • Возможность изменения конфигурации без перезапуска.
  • Поддержка обновления кода приложения без разрыва соединений.
  • Средства для переключения нагрузки в случае сбоя (failover).
  • Интеграция с различными системами мониторинга и ведения логов (Syslog, Prometheus, Sentry, OpenTelemetry).
  • Поддержка TLS-шифрования (применяется OpenSSL, BoringSSL или Rustls).
  • Готовые Rust-пакеты для создания HTTP-прокси, работы с сетевыми протоколами, разбора заголовков HTTP, учёта и ограничения трафика, балансировки нагрузки, работы с распределённой хэш-таблицей Ketama, поддержания кэша в оперативной памяти и асинхронной обработки таймаутов.

Среди изменений в новой версии:

  • В структуру SslDigest добавлено поле «extension», а для типажа TlsAccept реализован обработчик handshake_complete_callback, позволяющие прикреплять к TLS-соединению произвольные данные, специфичные для приложения. В качестве примера показано как использовать данную возможность для создания сервера, читающего информацию из сертификата клиента и возвращающего её в HTTP-ответе.
  • Добавлен типаж ConnectionFilter для фильтрации TCP-соединений на стадии до согласования параметров TLS, что позволяет экономить ресурсы, сбрасывая соединения на ранней стадии.
  • Добавлена поддержка виртуальных потоков транспортного уровня (Virtual L4 Streams), позволяющих интегрировать в pingora-proxy собственные реализации сетевых протоколов.
  • Реализована возможность использования опций verify_cert и verify_hostname в конфигурациях с rustls.
  • Для внешних crate-пакетов разрешён доступ к структуре HttpProxy для переопределения логики проксирования запросов.
  • Разрешено выделение фоновых обработчиков подзапросов из основного обработчика сеанса.
  • Предоставлена возможность отслеживания размера тела запросов HTTP1 и HTTP2, а также метрик работы прокси.
  • Добавлена возможность создания собственных сеансов для инкапсулированного HTTP-трафика.
  • Выставлено ограничения на использование версий библиотеки lru (0.16.3 или новее) из-за уязвимости в реализации итератора IterMut, приводящей к аварийному завершению из-за срабатывания проверки заимствования переменных (borrow checker).

Источник: http://www.opennet.ru/opennews/art.shtml?num=64710