Azure Durable Functions ⇄ Pulse
Durable Functions splits work into a deterministic, replayed orchestrator and side-effecting activities — the orchestrator can't do I/O directly, so every external call lives in an activity. Exactly the Temporal constraint: durable engines put I/O in an Activity. Repo example: examples/azure-durable-functions-pulse-bridge/.
The activity does the universal two calls (POST .../x/order-scoring/in, GET .../events/order-scoring.score.out).
Run it locally — the real orchestrator generator
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 drives the real orchestrate_order generator from function_app.py: each yield call_activity(...) executes the real activity and feeds the result back — what the Durable runtime does, minus the replay/checkpoint plumbing. So the whole orchestration is validated, not just the Pulse call:
amount= 2500 -> decision=escalate
amount= 300 -> decision=auto-approve
Run just the activity standalone: PULSE_URL=... python function_app.py.
Deploying to real Azure
function_app.py (v2 model) + host.json (extension bundle v4) + requirements.txt are deploy-ready for Azure Functions. The 🧪 status: orchestration proven against live Pulse; the Azure-hosted run needs your subscription.
Next
- Temporal guide — the same Activity pattern, self-hosted
- Azure Logic Apps guide