Escolhi Prefect 3 para orquestrar uma plataforma privada de dados de mercado e estratégias. O workload mistura agendas fixas, backfills parametrizados, child flows, cálculos longos e operações manuais. A implementação é majoritariamente Python, e muitos workflows precisam ser acionados por outras ferramentas, além de executados como deployments ou funções comuns em testes.
Por que Prefect se encaixa
Prefect mantém a orquestração próxima de Python normal. Isso importa quando as mesmas funções de domínio atendem uma ingestão diária, um backfill histórico limitado e uma correção ad hoc. Parâmetros, ramificações e composição permanecem diretos, sem forçar tudo para o formato de um DAG estático.
Por que não escolher Airflow automaticamente?
Airflow é excelente quando a organização precisa de um ecossistema maduro, muitos operadores, ownership visível de DAGs e um padrão conhecido por várias equipes. Seu modelo centrado no scheduler é uma força para grandes conjuntos de dependências batch regulares.
Essas não eram as restrições dominantes. Esta plataforma é mantida como um produto Python, possui muitos workflows parametrizados e disparados externamente, e evolui rapidamente entre ingestão, analytics e estratégias. Prefect ofereceu desenvolvimento mais rápido, maior flexibilidade de execução e menor carga de infraestrutura.
Os trade-offs são reais
Escolher Prefect não elimina trabalho operacional. O control plane exige ajuste de recursos. Catch-up do scheduler e concorrência precisam de limites deliberados. Airflow continua com ecossistema e mercado de talentos maiores.
Se a plataforma crescesse para centenas de equipes compartilhando milhares de DAGs batch majoritariamente estáticos, ou dependesse muito de operadores e governança já padronizados em Airflow, eu reavaliaria. Decisões arquiteturais devem expirar quando suas premissas expirarem.
O orquestrador não fornece confiabilidade sozinho
Dados de mercado são imperfeitos: provedores atrasam, instrumentos são ilíquidos, calendários diferem e históricos são republicados. A plataforma adiciona políticas explícitas:
- resolução por dia útil em vez de aritmética ingênua de calendário;
- timeouts e margens entre flows pai e filho;
- backfills retomáveis a partir de fontes oficiais;
- provedores alternativos sem misturar procedência silenciosamente;
- verificação de cobertura antes da finalização;
- finalização idempotente ou atômica para lotes críticos;
- alertas que distinguem warning de falha terminal.
@flow(timeout_seconds=politica.limite)
def ingerir_dados(data_alvo=None):
data = resolver_dia_util(data_alvo)
simbolos = executar(buscar_simbolos, politica.busca)
precos = executar_em_paralelo(buscar_precos, simbolos)
cobertura = validar(precos, data)
if not cobertura.aceitavel:
raise DadosIncompletos(cobertura)
finalizar_atomicamente(data, precos, procedencia=True)
A decisão em uma frase
Prefect se encaixa porque acelera o desenvolvimento de uma aplicação Python dinâmica, integra-se às outras ferramentas operacionais e atende o workload com uma infraestrutura menor.
Airflow continua sendo uma alternativa forte. A decisão sênior não é lealdade a uma ferramenta; é compreender o workload o suficiente para explicar o encaixe, o custo e a condição que levaria a uma mudança.