Sensores no Airflow: Poke, Reschedule e Deferral
Sensores aguardam uma condição externa. A decisão principal não é apenas quanto tempo esperar, mas qual componente manterá essa espera e qual capacidade será consumida.
Índice
- Três estratégias de espera
- Poke
- Reschedule
- Deferral
- Timeout, intervalo e falha
- Critério de escolha
- Referências

Três estratégias de espera
O parâmetro mode de um BaseSensorOperator possui dois valores: poke e
reschedule. Deferral é uma capacidade adicional implementada por alguns
Operators e Sensors; não é um terceiro valor de mode disponível
automaticamente em todos eles.
| Estratégia | Durante a espera | Custo ou dependência |
|---|---|---|
mode="poke" |
mantém um worker slot ocupado | reduz latência entre checks, mas consome capacidade de execução |
mode="reschedule" |
libera o worker entre checks | cria ciclos de reagendamento pelo scheduler |
| implementação deferrable | transfere a espera para um trigger | exige suporte do provider e um triggerer operacional |
Não há um limite universal de minutos para escolher entre elas. Duração esperada, latência tolerada, concorrência, custo do polling e capacidade do ambiente precisam ser avaliados juntos.
Poke
Em poke, o processo verifica a condição, aguarda poke_interval e verifica
novamente sem liberar o worker slot. Isso pode ser aceitável para baixa
concorrência e esperas realmente curtas, quando a resposta rápida justifica a
capacidade reservada.
O risco aparece quando muitos sensores permanecem ociosos em poke: tasks de
processamento podem ficar na fila mesmo que os workers estejam apenas esperando.
Pools separados limitam a competição, mas não removem o consumo de recursos.
Reschedule
Em reschedule, uma verificação sem sucesso coloca a task em estado de espera e
libera o worker até o próximo check. Essa opção atende sensores clássicos que não
oferecem deferral e não devem reter capacidade durante uma espera prolongada.
O benefício tem custo: cada nova verificação volta a passar pelo scheduler e
pela execução da task. Um poke_interval agressivo pode aumentar carga no
scheduler, no metastore e no sistema consultado.
1
2
3
4
5
6
7
8
9
10
11
from airflow.providers.standard.sensors.filesystem import FileSensor
aguardar_arquivo_local = FileSensor(
task_id="aguardar_arquivo_local",
fs_conn_id="fs_default",
filepath="data/input/relatorio.csv",
mode="reschedule",
poke_interval=60,
timeout=60 * 60,
)
O snippet pressupõe que está dentro de um DAG e que a Connection fs_default
existe. Os valores são ilustrativos.
Deferral
Um Operator deferrable suspende sua execução e registra um trigger assíncrono. O worker é liberado; quando a condição ocorre, o scheduler volta a enfileirar a task para concluir. O deployment precisa executar e monitorar pelo menos um triggerer.
O suporte é específico da implementação. Definir deferrable=True em uma classe
que não implementa deferral não cria esse comportamento.
Exemplo com um sensor do provider Amazon:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from datetime import datetime, timezone
from airflow.providers.amazon.aws.sensors.s3 import S3KeySensor
from airflow.sdk import DAG, task
with DAG(
dag_id="processar_vendas_s3",
schedule="@daily",
start_date=datetime(2026, 1, 1, tzinfo=timezone.utc),
catchup=False,
):
aguardar_arquivo = S3KeySensor(
task_id="aguardar_arquivo",
aws_conn_id="aws_default",
bucket_name="dados-producao",
bucket_key="raw//vendas.parquet",
deferrable=True,
poke_interval=5 * 60,
timeout=12 * 60 * 60,
)
@task
def processar():
processar_arquivo_validado()
aguardar_arquivo >> processar()
As funções e os tempos são placeholders. Antes de usar, confirme a versão do provider, a existência da Connection, as permissões no bucket e a capacidade do triggerer.
Timeout, intervalo e falha
poke_intervalcontrola o intervalo entre verificações;timeoutlimita quanto tempo o sensor pode aguardar pela condição;execution_timeoutlimita uma execução ou tentativa conforme a estratégia usada;soft_fail=Truetransforma o timeout do sensor emskipped, o que altera o fluxo downstream.
Escolha timeout a partir do atraso máximo aceito pelo workflow. Escolha o
intervalo a partir da latência necessária e do custo imposto à fonte. Backoff
pode reduzir polling quando a probabilidade de sucesso imediato diminui.
Um sensor concluído indica que sua condição retornou sucesso. Isso não garante que o dado esteja completo ou semanticamente válido, a menos que a própria condição faça essa verificação.
Critério de escolha
Eu começaria verificando se o provider oferece uma implementação deferrable. Se
oferecer, testaria o triggerer sob a concorrência esperada. Sem suporte a
deferral, usaria reschedule quando a espera não justificar manter um worker.
Reservaria poke para baixa concorrência e espera curta medida no ambiente.
Antes de produção, valide:
- máximo de sensores simultâneos;
- ocupação de worker slots e pools;
- capacidade e alta disponibilidade do triggerer;
- carga de polling sobre a fonte;
- atraso entre evento, detecção e início downstream;
- comportamento de timeout, retry e
soft_fail; - recuperação depois da indisponibilidade do scheduler ou triggerer.
Referências
APACHE AIRFLOW. Sensors. Disponível em: https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/sensors.html
APACHE AIRFLOW. Deferrable Operators & Triggers. Disponível em: https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/deferring.html
APACHE AIRFLOW PROVIDERS AMAZON. S3KeySensor. Disponível em: https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/_api/airflow/providers/amazon/aws/sensors/s3/index.html