- Apresenta estratégias para adicionar Rust gradualmente em servidores Non-Rust (JavaScript, Python, Java etc.)
- O objetivo é identificar funções críticas com gargalo de CPU que não atendem aos requisitos de desempenho e substituí-las por implementações em Rust
- As estratégias são divididas por Tier (nível de adoção de Rust), em que o Tier 0 não usa Rust e o último Tier reescreve o servidor inteiro em Rust
Estratégia
Tier 0: sem usar Rust
- Implementação de um endpoint de geração de QR code em um servidor Node.js
- Desempenho de referência: 1464 requisições por segundo, latência média de 68ms, latência p99 de 96ms, tamanho médio de resposta de 1506 bytes, memória de 1353MB
Tier 1: ferramenta CLI em Rust
- Reescrita da função de geração de QR code em Rust e compilação como ferramenta CLI
- O servidor host chama a ferramenta CLI
- Desempenho em relação à referência: 1,76x mais requisições por segundo, latência média reduzida para 0,57x, tamanho médio de resposta reduzido para 0,52x, memória reduzida para 0,92x
Tier 2: módulo Wasm em Rust
- Compila a função Rust como módulo Wasm e carrega/executa no servidor host usando um runtime Wasm
- No servidor Node.js, usa
wasm-bindgen
- Desempenho em relação à referência: 2,03x mais requisições por segundo, latência média reduzida para 0,50x
- Explica como escrever bindings Wasm manualmente (para usuários de outras linguagens)
Tier 3: função nativa em Rust
- Escreve a função em Rust, compila para código nativo e carrega/executa no runtime host
- No Node.js, usa
napi-rs
- Desempenho em relação à referência: 3,75x mais requisições por segundo, latência média reduzida para 0,26x
Tier 4: reescrita em Rust
- Reescreve todo o servidor host em Rust
- Na prática, reescrever apenas parte do servidor host é o mais realista
- Desempenho em relação à referência: 4,93x mais requisições por segundo, latência média reduzida para 0,21x, memória reduzida para 0,01x (uso de 13MB)
Conclusão
- Todas as estratégias são boas, mas o Tier 3 é o mais eficaz
- Se for possível usar uma biblioteca pronta para geração de bindings, escrever funções nativas em Rust é fácil e tem grande impacto no desempenho
4 comentários
Nossa... acabei mexendo um pouco com os dois enquanto fazia várias coisas meio como um faz-tudo, e isso é uma informação muito boa.
Tenho acompanhado Rust recentemente. É um texto interessante.
É um texto muito bom. Este é um exemplo de como usar Rust corretamente.
Parece que o Rust realmente está ganhando popularidade em áreas que antes eram resolvidas com C/C++.