Quando decidi pela primeira vez migrar a nossa pilha de backend de Python para Rust, não foi apenas por curiosidade – nasceu de pontos de dor reais relacionados com desempenho, custos de implementação e fiabilidade sob carga. O ecossistema web do Python – especialmente FastAPI – é uma alegria trabalhar para produtividade e iteração rápida. Mas à medida que o nosso tráfego cresceu e os limites de desempenho se tornaram aparentes, quis explorar o que o Rust poderia oferecer.
Neste artigo vou partilhar o que aprendi ao longo do caminho: as vantagens, as armadilhas e onde cada ecossistema ainda brilha.

Comparação de desempenho: Rust (Actix-Web) vs. Python (FastAPI)
Throughput e latência brutos
Uma das primeiras coisas que me impressionou ao fazer benchmarking foi o quão diferentes são os perfis de desempenho entre as frameworks web Rust e Python.
Em vários benchmarks independentes, o Actix-Web do Rust consistentemente supera o FastAPI em pedidos brutos por segundo e eficiência de memória. Num benchmark da comunidade, o Actix-Web lidou com milhares de pedidos a mais por segundo com menor latência e consumo de memória muito inferior comparado ao FastAPI.
Isto alinha-se com a observação mais ampla de que as abstrações de custo zero do Rust, e a falta de um coletor de lixo, tornam-no excepcionalmente eficiente ao servir HTTP em escala.
Implicações no mundo real
Na minha experiência, isto traduziu-se em:
- Throughput sustentado muito maior em testes de stress.
- Menos variabilidade sob carga.
- Menor uso de memória inativa comparado aos processos Python.
Dito isto, os benchmarks contam apenas parte da história: os gargalos do mundo real são frequentemente limitados pela base de dados ou pela rede. Para muitas aplicações, o desempenho do FastAPI é mais do que adequado, e ajustar o acesso à base de dados ou caching gera ganhos maiores do que a escolha da linguagem sozinha.
Diferenças ORM: Diesel vs SQLAlchemy
Mudar paradigmas ORM foi uma das partes mais culturalmente diferentes da migração.
Sistema de migrações
Em Python, usámos SQLAlchemy com migrações Alembic – uma abordagem que compara os seus modelos e gera scripts de migração automaticamente.
Em Rust, mudámos para Diesel, que assume uma postura muito diferente:
- As migrações são escritas manualmente como ficheiros SQL explícitos.
- Não há ferramentas de diferenciação automática.
- É dado mais controlo – e mais responsabilidade.
Isto foi inicialmente frustrante, mas a disciplina de escrever migrações manualmente levou a uma auditabilidade mais clara e menos surpresas em produção.
Segurança de tipo e garantias em tempo de compilação
É aqui que o Diesel realmente mudou como penso sobre código de base de dados: segurança de tipo em tempo de compilação.
O Diesel gera tipos Rust baseados no seu esquema, portanto nomes de colunas incompatíveis ou construções de consulta inválidas simplesmente não compilam. Conceitos como check_for_backend e exigir declarações explícitas de table_name significam que classes inteiras de bugs comuns desaparecem antes de executar uma consulta.
Em comparação, o SQLAlchemy apenas captura muitos erros em tempo de execução. Embora isto adicione flexibilidade, também significa mais dependência em testes para correção.
Construir e executar consultas
O construtor de consultas do Diesel usa o sistema de tipos do Rust e requer mais linhas de código comparado ao estilo expressivo mais dinâmico do SQLAlchemy – mas o trade-off é que o compilador prova muito por si.
Após um período de ajuste, vim a apreciar como a explicitude do Rust ajuda ao navegar lógica de consulta complexa durante refatorações.
Suporte de geração automática OpenAPI
Uma área onde o Python ainda se sente à frente imediatamente é a geração de esquema API.
FastAPI gera automaticamente documentação OpenAPI e vem com interfaces de navegador como ReDoc e Swagger UI em /docs e /redoc, tornando super fácil para clientes e colegas de equipa entenderem e explorarem a sua API.
O ecossistema do Rust está a evoluir aqui. Ferramentas como utoipa podem gerar especificações OpenAPI para Actix-Web, mas parecem mais manuais e fragmentadas comparadas à experiência perfeita do FastAPI. Há crates da comunidade para servir interfaces Swagger ou Redoc também, mas requerem configuração e anotação extra.
Espero que esta lacuna continue a diminuir – há esforços ativos na comunidade Rust para trazer uma experiência de documentação API mais suave que rivaliza com a do FastAPI.
Tamanho de implementação: compilação vs. dependências
Tempo de compilação Rust
A compilação do Rust é notoriamente mais lenta do que linguagens interpretadas. Durante o desenvolvimento, reconstruções – especialmente com crates grandes – podem parecer lentas comparadas a reexecutar um script Python.
Mas este custo é tempo de desenvolvimento, não tempo de produção. Uma vez compilados, os binários Rust são:
- Totalmente compilados antecipadamente
- Auto-contidos (sem virtualenv, tipicamente sem dependências dinâmicas)
- Pegada muito pequena em imagens de contentor
Isso torna as implementações mais simples e mais previsíveis.
Pegada de dependências Python
Aplicações Python frequentemente trazem um grande grafo de dependências: o próprio FastAPI, uvicorn, pydantic (agora muito mais rápido graças aos internos Rust), drivers de base de dados, etc.
Isto aumenta:
- Tamanho do contentor
- Complexidade de construção
- Superfície para conflitos de dependências
O Cargo do Rust produz um binário que encapsula tudo (geralmente), o que simplifica drasticamente a história de implementação.
Manutenibilidade
Esta foi a área com talvez o maior crescimento pessoal.
O Rust empurra-o para limites de propriedade claros, tratamento de erros explícito e design cuidadoso. Uma vez internalizados os erros de compilação do Rust, o próprio compilador torna-se uma forte proteção contra regressões.
Em contraste, o dinamismo do Python pode parecer sem esforço durante o desenvolvimento inicial – mas essa mesma flexibilidade às vezes leva a bugs mais difíceis de diagnosticar em produção a menos que apoiados por um conjunto robusto de testes.
As nossas bases de código Rust pareceram mais resilientes durante grandes refatorações, em grande parte graças à rigidez do compilador.
Documentação e experiência do programador
Documentação automática do FastAPI
A integração do FastAPI com OpenAPI, juntamente com ReDoc e Swagger UI, torna extremamente fácil a integração de novos programadores. É uma das maiores vitórias que vi na produtividade da equipa.
Geração de documentação Rust
As ferramentas de documentação integradas do Rust (cargo doc) são fenomenais para documentação ao nível do código. Encoraja a escrita de documentação ao lado do seu código, e o Rustdoc gera documentação HTML limpa e pesquisável.
Embora isto não substitua um bom endpoint /docs imediatamente, melhora grandemente a qualidade e descoberta da documentação centrada em código.
Conclusão
Mudar de Python para Rust para desenvolvimento backend não foi sobre favorecer uma linguagem sobre a outra – foi sobre alinhar com as prioridades do nosso projeto.
- O Rust deu-nos desempenho, previsibilidade e fiabilidade no tráfego de produção.
- O Python deu-nos velocidade de desenvolvimento e ergonomia de classe mundial.
Ambos os ecossistemas são poderosos. O que muda com o Rust é que muitos problemas que apenas apareceriam em tempo de execução no Python são em vez disso capturados em tempo de compilação no Rust, reduzindo surpresas e interrupções.
Escolher Rust significa investir na curva de aprendizagem – mas para equipas onde desempenho e correção importam mais, o trade-off tem valido a pena para nós.
Nota do autor
Este artigo foi escrito pelo criador do Hytale Multiplayer, um website focado em artigos técnicos e análises aprofundadas sobre o jogo Hytale, incluindo desenvolvimento de servidores, ferramentas e comparações com ecossistemas relacionados como Minecraft. Se gosta de conteúdo prático focado em engenharia, sinta-se à vontade para explorar mais artigos lá.








