Azure Durable Functions ⇄ Pulse
Durable Functions découpe le travail entre un orchestrateur déterministe et rejoué, et des activities à effets de bord — l'orchestrateur ne peut pas faire d'I/O directement, donc chaque appel externe vit dans une activity. Exactement la contrainte de Temporal : les moteurs durables mettent l'I/O dans une Activity. Exemple du repo : examples/azure-durable-functions-pulse-bridge/.
L'activity fait les deux appels universels (POST .../x/order-scoring/in, GET .../events/order-scoring.score.out).
Lancez-le en local — le vrai générateur d'orchestrateur
pulse server start --dev
mkdir app && cp pulse.yaml app/ && (cd app && pulse deploy .)
pip install azure-functions azure-functions-durable requests
PULSE_URL=http://localhost:9090 python run_local.py
run_local.py pilote le vrai générateur orchestrate_order de function_app.py : chaque yield call_activity(...) exécute la vraie activity et renvoie le résultat — ce que fait le runtime Durable, moins la plomberie replay/checkpoint. Toute l'orchestration est donc validée, pas seulement l'appel Pulse :
amount= 2500 -> decision=escalate
amount= 300 -> decision=auto-approve
L'activity seule : PULSE_URL=... python function_app.py.
Déployer sur le vrai Azure
function_app.py (modèle v2) + host.json (extension bundle v4) + requirements.txt sont prêts pour Azure Functions. Le statut 🧪 : orchestration prouvée contre un Pulse vivant ; le run hébergé Azure demande votre souscription.
Ensuite
- Guide Temporal — le même pattern Activity, self-hosted
- Guide Azure Logic Apps