A empresa Cloudflare divulgou a versão 0.7 do framework Pingora, destinado ao desenvolvimento de serviços de rede seguros e de alto desempenho na linguagem Rust. O proxy construído com o Pingora já está em uso na rede de entrega de conteúdo da Cloudflare há mais de dois anos, substituindo o nginx e processando mais de 40 milhões de solicitações por segundo. O código foi escrito em Rust e publicado sob a licença Apache 2.0.
Principais recursos do Pingora:
- Suporte a HTTP/1 e HTTP/2 (planejando HTTP/3), além da possibilidade de criar serviços que utilizem seus próprios protocolos ou UDP/TCP.
- Suporte ao processamento de solicitações em múltiplas threads de forma assíncrona.
- Possibilidade de anexar manipuladores de callback e filtros, permitindo o gerenciamento de várias etapas do processamento da solicitação, bem como modificar, redirecionar, bloquear e registrar solicitações e respostas.
- Proxy para gRPC e WebSocket.
- Balanceadores de carga plugáveis.
- Capacidade de alterar a configuração sem reinicialização.
- Suporte à atualização do código do aplicativo sem interromper as conexões.
- Ferramentas para comutação de carga em caso de falha (failover).
- Integração com diversos sistemas de monitoramento e registro de logs (Syslog, Prometheus, Sentry, OpenTelemetry).
- Suporte à criptografia TLS (utilizando OpenSSL, BoringSSL ou Rustls).
- Pacotes Rust prontos para criar proxies HTTP, trabalhar com protocolos de rede, analisar cabeçalhos HTTP, contabilizar e limitar tráfego, balancear carga, trabalhar com tabelas de hash distribuídas Ketama, manter o cache em memória e processar timeouts de forma assíncrona.
Entre as mudanças na nova versão:
- A estrutura SslDigest ganhou um campo "extension", e para o tipo TlsAccept foi implementado um manipulador handshake_complete_callback, permitindo anexar dados específicos do aplicativo à conexão TLS. Como exemplo, foi mostrado como utilizar essa funcionalidade para criar servidor, que lê informações do certificado do cliente e as retorna na resposta HTTP.
- Foi adicionado o tipo ConnectionFilter para filtrar conexões TCP na fase anterior ao acordo dos parâmetros TLS, economizando recursos ao derrubar conexões em uma fase inicial.
- Foi adicionada a suporte a fluxos virtuais de camada de transporte (Virtual L4 Streams), permitindo a integração de implementações personalizadas de protocolos de rede no pingora-proxy.
- Implementada a possibilidade de usar as opções verify_cert e verify_hostname nas configurações com rustls.
- Para pacotes crate externos, foi permitido o acesso à estrutura HttpProxy para redefinir a lógica de proxy das solicitações.
- Foi autorizada a alocação de manipuladores de fundo de subconsultas a partir do manipulador principal da sessão.
- Disponibilizada a capacidade de monitorar o tamanho do corpo das solicitações HTTP1 e HTTP2, bem como as métricas de operação do proxy.
- Foi adicionada a possibilidade de criar sessões personalizadas para encapsular tráfego HTTP.
- Impostas limitações no uso das versões da biblioteca lru (0.16.3 ou mais recentes), devido a uma vulnerabilidade na implementação do iterador IterMut, que pode levar a falhas devido à verificação de empréstimos de variáveis (borrow checker).
Fonte: opennet.ru
