Entendendo os Modos de Sensor do Airflow: Poke vs Reschedule
- Gilmar Pupo
- 29 de set.
- 4 min de leitura
Um mergulho profundo na escolha do modo de sensor certo para seus pipelines do Apache Airflow
O que são Sensores no Airflow?
Sensores são um tipo especial de operador do Airflow que aguardam uma condição específica ser atendida antes de permitir a execução de tarefas posteriores (downstream). Pense neles como porteiros em seu pipeline de dados — eles verificam continuamente se algo está pronto antes de dar o sinal verde.
Casos de uso comuns incluem:
Aguardar um arquivo aparecer em um diretório ou bucket S3.
Verificar se um endpoint de API está disponível.
Monitorar registros de banco de dados para condições específicas.
Aguardar verificações de saúde de sistemas externos.
Fazer polling para callbacks de webhook.
Os Dois Modos: Poke vs Reschedule
Ao configurar um sensor no Airflow, você deve escolher entre dois modos de execução: poke e reschedule. Essa escolha, aparentemente simples, tem implicações significativas no desempenho e na utilização de recursos do seu cluster Airflow.
Modo 1: Poke (Padrão)
Python
@task.sensor(
poke_interval=30,
timeout=3600,
mode="poke" # Modo padrão
)
def check_api_status() -> PokeReturnValue:
# Sua lógica de sensor aqui
pass
Como funciona:
O sensor ocupa um slot de worker continuamente.
Ele verifica a condição em intervalos regulares (definidos por poke_interval).
Entre as verificações, o worker "dorme" (sleeps), mas permanece alocado para esta tarefa.
O worker só é liberado quando a condição é atendida ou o sensor atinge o timeout.
Analogia: Imagine que você está esperando uma encomenda. Com o modo "poke", você fica na porta o tempo todo, verificando a cada poucos minutos se o entregador chegou. Você não sai do seu posto.
Modo 2: Reschedule
Python
@task.sensor(
poke_interval=300, # 5 minutos
timeout=3600,
mode="reschedule"
)
def check_file_existence() -> PokeReturnValue:
# Sua lógica de sensor aqui
pass
Como funciona:
O sensor verifica a condição uma vez.
Se não for atendida, ele libera o slot de worker completamente.
A tarefa do sensor é reagendada para ser executada novamente após poke_interval segundos.
Cada verificação é tratada como uma instância de tarefa separada pelo scheduler.
Analogia: Com o modo "reschedule", você verifica se a encomenda chegou e depois vai fazer outras coisas. Você define um alarme para se lembrar de verificar novamente em alguns minutos. Você está livre para lidar com outras tarefas nesse meio tempo.
A Regra Crítica: Quando Usar Cada Modo
Aqui está a regra de ouro que todo desenvolvedor Airflow deve memorizar:
⚡ Intervalo de Verificação (poke_interval) < 5 Minutos → Use mode="poke"
Por quê?
Criar uma nova instância de tarefa tem uma sobrecarga (carga no scheduler, escritas no banco de dados, atualizações de metadados).
Para verificações frequentes, essa sobrecarga se torna excessiva.
O worker já estaria ocupado de qualquer maneira, então mantê-lo alocado é mais eficiente.
O Scheduler pode focar em outras tarefas em vez de reagendar constantemente este sensor.
🔄 Intervalo de Verificação (poke_interval) ≥ 5 Minutos → Use mode="reschedule"
Por quê?
Slots de worker são valiosos — não os desperdice "dormindo" por longos períodos.
A sobrecarga de reagendamento se torna insignificante em comparação com o tempo de espera.
Permite uma melhor utilização de recursos em todo o seu cluster.
Outras tarefas podem usar aquele slot de worker de forma produtiva.
Implicações de Desempenho
Vamos examinar o impacto no mundo real de escolher o modo errado:
Cenário: 100 Sensores com Intervalos de 30 Segundos
Com mode="poke" (Correto):
100 workers ocupados continuamente.
Carga mínima no scheduler.
Histórico de execução de tarefas limpo.
Com mode="reschedule" (Errado!):
100 novas instâncias de tarefa criadas a cada 30 segundos.
12.000 operações do scheduler por hora.
Crescimento massivo do banco de dados com registros de instâncias de tarefa.
O scheduler se torna o gargalo.
A interface web fica lenta devido ao excesso de instâncias de tarefa.
Cenário: 50 Sensores com Intervalos de 15 Minutos
Com mode="reschedule" (Correto):
50 workers liberados entre as verificações.
4 operações de reagendamento por sensor por hora.
Workers disponíveis para outras tarefas críticas.
Com mode="poke" (Errado!):
50 workers permanentemente ocupados (potencialmente bloqueando outras tarefas).
Recursos desperdiçados durante as esperas de 15 minutos.
Pode ser necessário escalar o cluster desnecessariamente.
Considerações Avançadas
1. Recuo Exponencial (Exponential Backoff) (Airflow 3.x)
Este recurso aumenta gradualmente o tempo de espera entre as verificações, reduzindo a carga desnecessária em sistemas externos. Ele funciona com ambos os modos, poke e reschedule.
Benefícios:
Começa com verificações frequentes quando a condição pode ser atendida em breve.
Aumenta o intervalo se a condição não for atendida rapidamente.
Reduz problemas de limite de taxa de APIs (API rate limit).
É mais "respeitoso" com os serviços externos.
2. Considerações sobre Pools
Se você estiver usando pools do Airflow para limitar a concorrência, o modo Poke manterá um slot do pool ocupado continuamente, enquanto o modo reschedule o liberará entre as verificações. Considere isso ao projetar sua estratégia de pools.
3. Configurações de Timeout
Sempre defina timeouts razoáveis. Sem um timeout, um sensor poderia esperar indefinidamente, ocupando permanentemente um slot de worker (no modo poke) ou criando infinitas tarefas reagendadas (no modo reschedule).
4. Opção de Falha Suave (Soft Fail)
Para condições não críticas, a opção soft_fail permite que o pipeline continue mesmo que o sensor atinja o timeout, o que é útil para fontes de dados opcionais.
Erros Comuns a Evitar
Erro 1: Usar Reschedule para Intervalos Curtos
Solução: Use mode="poke" para intervalos menores que 5 minutos.
Erro 2: Usar Poke para Intervalos Longos
Solução: Use mode="reschedule" para intervalos de 5 minutos ou mais.
Erro 3: Não Definir um Timeout
Solução: Sempre defina um timeout razoável.
Erro 4: Ignorar o Recuo Exponencial (Exponential Backoff)
A abordagem ideal é usar exponential_backoff=True para reduzir gradualmente a frequência de polling.
Árvore de Decisão
Use este fluxograma para escolher o modo certo:
O seu poke_interval é menor que 5 minutos?
│
├─ SIM → Use mode="poke"
│ └─ Mantém o slot de worker, evita sobrecarga no scheduler
│
└─ NÃO → Use mode="reschedule"
└─ Libera o slot de worker, melhor utilização de recursos
Conclusão
A escolha entre os modos poke e reschedule é uma decisão de desempenho que afeta todo o seu cluster Airflow. Siga a regra dos 5 minutos para evitar os erros mais comuns:
✅ Intervalos curtos (< 5 min) → mode="poke" ✅ Intervalos longos (≥ 5 min) → mode="reschedule"
Lembre-se: o objetivo é equilibrar a capacidade de resposta com a eficiência dos recursos.
Boas detecções! 🚀



Comentários