Trash On Wheels - Kitchen Trash Bin On Wheels at Valeria Sturm blog
Kitchen Trash Bin On Wheels at Valeria Sturm blog

O que é o trash on wheels e por que ele ainda aparece nas reuniões de arquitetura

trash on wheels é um framework de orquestração de pipelines de dados que nasceu com a proposta de substituir workflows manuais em shell script ou cron jobs por algo que pelo menos mantivesse um rastro do que foi executado, quando foi executado e se deu errado. Ele ganhou mais atenção recentemente porque alguns times migraram dele para soluções como Prefect, Dagster ou Airflow após sentirem a mesma dor que eu senti no começo: perder horas rastreando por quê que uma job não rodou às 3 da manhã. O conceito central é simples. Você define dependências entre tarefas, marca horários de execução e deixa o sistema rodar. Não é mágica. É basicamente um scheduler com uma interface web que mostra o status de cada execução. O diferencial prático é que ele persiste metadados de cada corrida, então você consegue ver logs, tempo de execução, estado anterior e recente sem precisar caçar arquivos de log espalhados pelo servidor.

Instalando e configurando o trash on wheels

Você precisa de Python 3.9 ou superior instalado. A instalação padrão é via pip, mas vale instalar dentro de um virtualenv para não bagunçar o ambiente do sistema. O comando é direto: pip install trash-on-wheels. Depois disso, inicialize o banco de dados com o comando de migração que o framework fornece. Ele usa SQLite por padrão, o que funciona bem para projetos pequenos e times que não querem administrar um PostgreSQL separado só pra isso. A configuração inicial acontece num arquivo de projeto que fica na raiz do seu diretório. Nele você define os workers, o scheduler, o backend de storage e as credenciais dos serviços que seus pipelines vão acessar. Eu sempre recomendo começar com o backend local mesmo, porque migrar de SQLite pra Postgres depois do pipeline já funcionando costuma gerar dor de cabeça desnecessária com paths e permissões.

Construindo o primeiro pipeline

Um fluxo básico no trash on wheels começa com a definição de tarefas. Cada tarefa é uma função Python que recebe um contexto e retorna dados ou executa uma ação. O framework conecta as tarefas através de argumentos de dependência declarados. Você não precisa escrever código de fila ou gerenciar mensagens, o que é um alívio quando o time não tem engenheiro de dados dedicado. Vejo muitas pessoas cometendo o erro de colocar lógica de negócio pesada dentro das próprias tarefas do scheduler. Isso funciona no começo, mas quando o volume cresce, a coisa vira um saco de manter. A prática recomendada é manter as tarefas do trash on wheels leves e delegar o trabalho pesado para módulos separados que elas apenas invocam. Isso também facilita testar cada parte isoladamente.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Os logs ficam disponíveis na interface web automaticamente. Você clica numa execução e vê o stdout e stderr de cada tarefa. Achei isso útil nas primeiras vezes em que precisei debugar um pipeline de extração de API que falhava com timeout intermitente. O problema era que a API de origem impunha rate limiting, mas o trash on wheels não tinha retry configurado por padrão, então cada falha era permanente. Configurei retry com backoff exponencial e o problema sumiu. Isso não é óbvio pela documentação, que fala de retry mas não mostra exemplos práticos do retry em tarefas que acessam endpoints externos.

Pegadinhas que ninguém conta

O trash on wheels não escala bem para pipelines que precisam processar centenas de gigabytes por corrida. O scheduler fica lento quando o número de execuções históricas passa de mil, porque o banco de dados vira gargalo. Se o seu caso é esse, considere usar PostgreSQL desde o início, mesmo que no começo pareça overkill. A diferença de performance é significativa e evita ter que refazer a configuração depois. Outro ponto que gera confusão é a relação entre variáveis de ambiente e o arquivo de configuração. O framework prioriza variáveis de ambiente, mas algumas configs só são lidas do arquivo. Já perdi tempo achando que uma variável não estava sendo aplicada quando na verdade ela simplesmente não era reconhecida naquela versão. Sempre verifique a versão exata do pacote e consulte o changelog antes de confiar que uma feature está disponível.

Quando eu precisava fazer deploy automatizado de pipelines para produção, percebi que o trash on wheels não tem um conceito nativo de versionamento de DAGs. Se você atualizar um arquivo de configuração, as execuções anteriores continuam existindo e podem conflitar com as novas definições. Minha solução foi criar um padrão interno onde cada mudança de DAG gera um novo nome de fluxo com sufixo de versão, mantendo os antigos mas desativando-os automaticamente após validação. Não é elegante, mas funciona.

E quando o trash on wheels não é a resposta certa

Se o seu time precisa de controle granular sobre recursos, execução paralela complexa, ou integração nativa com ecossistemas cloud como BigQuery ou Redshift sem configuração manual extensiva, outras ferramentas podem ser mais adequadas. O trash on wheels brilha em cenários de média complexidade onde o objetivo principal é substituir cron jobs e ter visibilidade. Ele não é projetado para workloads distribuídos massivos nem para equipes que precisam de governança avançada de dados desde o dia um. O download e a documentação oficial estão no repositório do projeto. A comunidade responde issues com frequência razoável, mas os prazos de resposta variam bastante dependendo da complexidade. Antes de adotar, rode um proof of concept com pelo menos dois pipelines reais do seu contexto, não apenas exemplos de tutorial. A experiência prática mostra rapidamente se a ferramenta cabe no seu fluxo ou se vai virar outro item para manter e negligenciar.