This sample demonstrates the sub-orchestrations pattern with the Azure Durable Task Scheduler using the Python SDK. Sub-orchestrations allow you to break down complex workflows into smaller, reusable components that can be called from parent orchestrations.
In this sample:
- The main orchestrator function gets a list of orders from an activity function
- For each order, it starts a sub-orchestration to process it
- Each sub-orchestration runs a sequence of activities (inventory check, payment, shipping, notification)
- The main orchestrator aggregates the results from all sub-orchestrations
Sub-orchestrations are useful for:
- Breaking down complex workflows into simpler, more maintainable pieces
- Reusing common workflow patterns across different orchestrations
- Processing collections of items in parallel
- Python 3.9+
- Docker (for running the emulator) installed
- Azure CLI (if using a deployed Durable Task Scheduler)
There are two ways to run this sample locally:
The emulator simulates a scheduler and taskhub in a Docker container, making it ideal for development and learning.
- Pull the Docker Image for the Emulator:
docker pull mcr.microsoft.com/dts/dts-emulator:latest- Run the Emulator:
docker run --name dtsemulator -d -p 8080:8080 -p 8082:8082 mcr.microsoft.com/dts/dts-emulator:latestWait a few seconds for the container to be ready.
Note: The example code automatically uses the default emulator settings (endpoint: http://localhost:8080, taskhub: default). You don't need to set any environment variables.
Local development with a deployed scheduler:
-
Install the durable task scheduler CLI extension:
az upgrade az extension add --name durabletask --allow-preview true -
Create a resource group in a region where the Durable Task Scheduler is available:
az provider show --namespace Microsoft.DurableTask --query "resourceTypes[?resourceType=='schedulers'].locations | [0]" --out tableaz group create --name my-resource-group --location <location>
-
Create a durable task scheduler resource:
az durabletask scheduler create \ --resource-group my-resource-group \ --name my-scheduler \ --ip-allowlist '["0.0.0.0/0"]' \ --sku-name "Dedicated" \ --sku-capacity 1 \ --tags "{'myattribute':'myvalue'}" -
Create a task hub within the scheduler resource:
az durabletask taskhub create \ --resource-group my-resource-group \ --scheduler-name my-scheduler \ --name "my-taskhub" -
Grant the current user permission to connect to the
my-taskhubtask hub:subscriptionId=$(az account show --query "id" -o tsv) loggedInUser=$(az account show --query "user.name" -o tsv) az role assignment create \ --assignee $loggedInUser \ --role "Durable Task Data Contributor" \ --scope "/subscriptions/$subscriptionId/resourceGroups/my-resource-group/providers/Microsoft.DurableTask/schedulers/my-scheduler/taskHubs/my-taskhub"
Once you have set up either the emulator or deployed scheduler, follow these steps to run the sample:
- First, activate your Python virtual environment (if you're using one):
python -m venv venv
source venv/bin/activate # On Windows, use: venv\Scripts\activate- If you're using a deployed scheduler, you need set Environment Variables:
export ENDPOINT=$(az durabletask scheduler show \
--resource-group my-resource-group \
--name my-scheduler \
--query "properties.endpoint" \
--output tsv)
export TASKHUB="my-taskhub"- Start the worker in a terminal:
python worker.pyYou should see output indicating the worker has started and registered the orchestration and activities.
- In a new terminal (with the virtual environment activated if applicable), run the client (which is a FastAPI server):
Note: Remember to set the environment variables again if you're using a deployed scheduler.
python client.pyLearn how to set up identity-based authentication when you deploy the app Azure.
When you run the sample, you'll see output from both the worker and client processes:
The worker shows:
- Registration of the orchestrators and activities
- Notification when orders are generated
- Status updates as each order is processed through the various steps (inventory check, payment, shipping, notification)
- Each step has a random chance of succeeding or failing
The client shows:
- Starting the orchestration
- The final result, which includes:
- The list of orders that were processed
- How many orders were completed successfully
- How many orders failed
- Detailed results for each order, including failure reasons if applicable
The example demonstrates how multiple sub-orchestrations can run in parallel, with each managing its own workflow of activities.
To access the Durable Task Scheduler Dashboard and review your orchestration:
- Navigate to http://localhost:8082 in your web browser
- Click on the "default" task hub
- You'll see the orchestration instance in the list
- Click on the instance ID to see:
- The main orchestration
- All the sub-orchestrations it created
- The activities that were called
- The inputs and outputs at each step
- Navigate to the Scheduler resource in the Azure portal
- Go to the Task Hub subresource that you're using
- Click on the dashboard URL in the top right corner
- Search for your orchestration instance ID
- Review the execution details
The dashboard helps visualize the parent-child relationship between the main orchestration and its sub-orchestrations, making it easier to understand the flow and identify any issues.