Airflow 3 DAG Authoring: como escrever DAGs que aguentam produção
Escrever uma DAG que roda é fácil. Escrever uma que pode rodar de novo, falhar no meio e continuar certa é o que esta certificação da Astronomer cobra.
Eu sou Gabriel Henrique, engenheiro de dados, e uso Apache Airflow para orquestrar pipelines e mais de dez automações de governança. Em novembro de 2025 conquistei a Apache Airflow 3 DAG Authoring, da Astronomer, um mês depois da Airflow 3 Fundamentals.
A Fundamentals cobre como o Airflow funciona. A DAG Authoring cobre como escrever bem.
TaskFlow API
Com o decorator @task, uma função Python vira tarefa, e o retorno dela passa para a próxima por XCom sem código extra. A DAG fica parecida com um script comum, mais fácil de ler e de revisar.
from airflow.sdk import dag, task
@dag(schedule="@daily", catchup=False)
def carga_diaria():
@task
def extrair():
return ["arquivo_a.csv", "arquivo_b.csv"]
@task
def carregar(arquivo: str):
...
carregar.expand(arquivo=extrair())
carga_diaria()
Mapeamento dinâmico de tarefas
No exemplo acima, o .expand() cria uma tarefa por arquivo em tempo de execução. Se amanhã chegarem cinco arquivos, surgem cinco tarefas, cada uma com log e retentativa próprios. Isso substitui loops escritos à mão dentro de uma tarefa só.
Agendamento por dados com Assets
No Airflow 3, os antigos Datasets passaram a se chamar Assets. Uma DAG pode rodar quando um asset é atualizado, em vez de esperar um horário fixo. Para cadeias de pipelines, isso elimina a adivinhação de "a carga anterior já terminou?".
Ramificação, regras de disparo e sensores
- Branching: escolher o caminho da DAG conforme uma condição.
- Trigger rules: decidir se uma tarefa roda quando a anterior falha ou é pulada.
- Sensores em modo deferrable: esperar um evento sem ocupar um worker parado.
Idempotência: a regra que mais importa
Uma tarefa idempotente produz o mesmo resultado se rodar uma ou dez vezes. Na prática:
- Use a data lógica da execução para filtrar a janela de dados, e não a hora atual.
- Prefira sobrescrever a partição ou fazer MERGE, em vez de apenas inserir.
- Deixe retentativas configuradas, porque a tarefa aguenta rodar de novo.
Com isso, reprocessar um dia que falhou vira um clique, e não uma limpeza manual de duplicados.
Testar antes de subir
O dag.test() roda a DAG inteira localmente, em um processo só, o que facilita depurar com breakpoint. Junto com testes que verificam se todas as DAGs carregam sem erro, ele pega boa parte dos problemas antes do deploy.
Próximo passo
Depois desta, fiz a AI Orchestration Fundamentals, que aplica os mesmos padrões a tarefas que chamam modelos de IA.
Outros projetos de orquestração estão no portfólio de Gabriel Henrique, Data Engineer. Eu sou Gabriel Henrique e escrevo sobre Airflow, Databricks e engenharia de dados.