Rust no front da fila: media-svc na real
Por que escolhemos Rust pra dois serviços de uma plataforma 90% Go e o que aprendemos.
Camverly é uma plataforma feita em Go — 13 dos 15 serviços. Os outros dois são Rust: media-svc (processamento de imagem) e seo-svc (análise de texto, geração de sitemap). A pergunta que aparece sempre que conto isso é: por que Rust se Go cobre 90% do que vocês fazem? A resposta tem três camadas, e tentar simplificar é fingir que a decisão foi mais fácil do que foi.
Camada um: CPU-bound real. Media-svc processa upload de imagem e gera 4-7 variantes (WebP, AVIF, thumbnails) em paralelo. Cada variante é loop apertado de manipulação de pixels. Em Go, isso significa goroutine + cgo pra libvips, com GC pressure visível em alocações de buffer. Em Rust, é zero-cost abstraction com image-rs ou ravif puros. Benchmark mostrou 2.4x de throughput em Rust pra mesma máquina. Pra serviço que vai ser CPU bottleneck, isso vira economia de instância.
Camada dois: dependências de qualidade. ravif, image-rs, libvips bindings em Rust têm manutenção ativa de quem está fazendo image processing como objetivo principal. As mesmas libraries em Go são bindings cgo de baixa qualidade ou portas parciais. Quando você escolhe linguagem, você está escolhendo ecossistema. Pra HTTP server, Go ganha. Pra image processing, Rust ganha. Aceitar isso evitou que escrevêssemos código burro tentando segurar a uniformidade.
Camada três: o time aprende uma linguagem nova. Esse foi o argumento contra. Manter dois serviços em linguagem que nenhum dev domina é risco. Mitigamos isso fazendo media-svc e seo-svc os menores serviços da fleet — total de 800 linhas cada, sem lógica de negócio complexa. Quem chega no time aprende Rust o suficiente pra mexer em duas semanas, porque o escopo é pequeno e bem definido. Se Rust crescesse pra mais serviços, esse cálculo mudaria.
O que aprendemos depois de seis meses: a integração foi mais fácil do que esperávamos. Ambos servem HTTP, ambos publicam em NATS, ambos seguem a mesma estrutura hexagonal. A linguagem some no nível de operações; sysadmin não precisa saber se é Go ou Rust pra reiniciar. Onde ainda dói: tempo de build (Rust compila 3x mais devagar que Go, e isso é sentido em CI). Mas pra dois serviços de baixa frequência de mudança, isso é absorvível.