Airflow ⇄ Pulse
Airflow possède le scheduling/retries du DAG ; Pulse est la task de traitement de flux temps réel qu'il appelle. Exemple du repo : examples/airflow-pulse-bridge/ — validé de bout en bout sur Airflow 3.0.3 via dag.test() (in-process, sans scheduler/webserver).
dag.py est un DAG TaskFlow ; l'appel Pulse est un seul @task qui fait les deux appels universels (POST .../x/order-scoring/in, GET .../events/order-scoring.score.out).
Lancez-le — le seul piège spécifique à Airflow
Airflow est lourd et ses dépendances legacy cassent sur un Python système moderne — installez-le dans un virtualenv avec les constraints officielles :
pulse server start --dev
mkdir app && cp pulse.yaml app/ && (cd app && pulse deploy .)
python3 -m venv .venv && . .venv/bin/activate
PYV=$(python -c 'import sys;print(f"{sys.version_info.major}.{sys.version_info.minor}")')
pip install "apache-airflow==3.0.3" requests \
--constraint "https://raw.githubusercontent.com/apache/airflow/constraints-3.0.3/constraints-${PYV}.txt"
export AIRFLOW_HOME=$PWD/.airflow AIRFLOW__CORE__LOAD_EXAMPLES=False
airflow db migrate # init de la metadata DB, une fois
python dag.py # exécute dag_obj.test() de bout en bout
Sortie validée
O-2500 amount=2500 -> high_value=True decision=escalate
Airflow planifie et réessaie en minutes ; Pulse tient l'état par clé en millisecondes. C'est la division : le DAG reste taillé batch, l'intelligence de flux vit dans le stage que vous enrichissez librement.