Azure Batch: Running Thousands of Jobs in the Cloud Without Managing a Single Scheduler
A complete, plain-English guide to pools, nodes, jobs and tasks, how the service schedules work, how data moves, how to scale and secure it, and when to choose something else.
Imagine you have been given one million photos and a simple instruction: shrink every one of them, add a watermark, and save the results. Your laptop can do one photo in about two seconds. That means roughly twenty-three days of nonstop work. Now imagine you could borrow two thousand computers for twenty minutes instead, let each one handle a small slice of the pile, and hand them all back when the last photo is done. The job that took weeks now takes less than a coffee break, and you only pay for the minutes you used.
That is the core idea behind Azure Batch. It is the Microsoft Azure service built for exactly this kind of work: large piles of independent or loosely connected jobs that need a lot of computing power for a limited time. In this guide you will learn what Azure Batch is, the words everyone uses around it, how it works on the inside, how data flows through it, how to make it fast, cheap, safe and observable, and how to avoid the mistakes that catch most newcomers.
1What Azure Batch Is and Why It Exists
Before any vocabulary, it helps to understand the problem. Azure Batch only makes sense once you feel the pain it removes.
The problem: work that is too big for one machine
Many real tasks in science, media, finance and engineering look the same on the surface. There is a large amount of work. It can be cut into smaller pieces. Each piece takes a while on its own. And the pieces do not need to wait for each other, or only need to wait in a simple order. Rendering the frames of an animated film, running thousands of what-if scenarios on a bank’s portfolio, aligning DNA sequences from a hospital study, and converting a library of videos into many formats are all examples.
The old way to solve this was to buy a rack of servers, install a scheduling program on them, and keep them running. That works, but it has three painful side effects. The servers sit idle most of the time, yet you pay for them every day. When a deadline hits, you still do not have enough of them. And somebody has to patch, monitor and repair that cluster forever.
The answer: rent a cluster on demand and let a service run it
Azure Batch is a managed job scheduling and compute management service. “Managed” means Microsoft runs the scheduling brain for you. “Job scheduling” means it decides which piece of work runs on which computer and when. “Compute management” means it creates, grows, shrinks and removes the virtual machines that do the work. You describe the work and the kind of machines you want. Azure Batch does the rest.
Think of a busy catering company that gets a huge wedding order. It does not buy fifty ovens. Instead it calls a staffing agency, asks for forty cooks for one day, hands each cook a stack of recipe cards, and sends them home afterward. A dispatcher at the agency makes sure every card gets cooked and re-assigns cards if a cook falls sick. Azure Batch is the agency and the dispatcher at the same time: cooks are virtual machines, recipe cards are tasks.
What you pay for
There is no separate charge for the Azure Batch service itself. You pay for the things it uses on your behalf: the virtual machines while they exist, the storage that holds your input and output files, and any network traffic that leaves Azure. Virtual machines are billed by the second for most sizes, which is the reason short, bursty workloads are such a good fit. A pool of five hundred machines that lives for forty minutes costs far less than a small cluster that lives all month.
Where Azure Batch is used
Rendering is the classic example. Azure Batch supports rendering applications such as Autodesk Maya, Autodesk 3ds Max, Arnold and V-Ray, and studios use pools of machines to turn scene files into finished frames. Life sciences is another large area. The workflow engine Nextflow has a built-in Azure Batch executor, and Cromwell on Azure, a workflow runner used with genomics pipelines such as those from the Broad Institute ecosystem, schedules its steps on Batch. Financial teams use it for risk simulations, engineers use it for crash and fluid simulations, and data teams use it behind Azure Data Factory, which can run custom activities on a Batch pool.
If the work comes as a pile of units that can each run to completion on a normal computer, Azure Batch is a strong candidate. If the work is a website that must answer a click in milliseconds, it is not.
2Where Azure Batch Came From: A Short History of Batch Computing
Every cloud service answers an older problem. Knowing the older answers explains why Azure Batch looks the way it does.
The era of the shared cluster
Long before the cloud, universities, laboratories and large companies owned clusters: racks of identical servers joined by a fast network. Many people wanted to use them at once, so a program called a job scheduler was placed in front. You wrote a small script that said how many processors you needed, for how long and which program to run. You handed it to the scheduler, and it placed your request in a queue. When enough machines were free, your program ran. Well known schedulers from this world include Slurm, PBS and HTCondor, and they are still used in research centers today.
This design had a clear strength: the cluster was never idle while the queue was long. It also had clear weaknesses. The cluster had a fixed size. If twenty teams wanted to run a big study in the same week, nineteen of them waited. If nobody had work, the machines still consumed electricity and staff time. Buying more machines for the busiest week of the year meant owning a lot of idle hardware for the other fifty-one weeks.
Grids, then elastic clouds
Researchers tried to solve the sharing problem with grid computing, which linked clusters from different institutions into one large pool. That helped but introduced hard questions about trust, software versions and data location. The public cloud then changed the picture in a simpler way. Instead of linking existing hardware, you could rent new virtual machines in minutes and return them when finished. The size of the cluster stopped being a purchase decision and became a setting.
An old cluster is like owning a fleet of delivery vans. A cloud pool is like using a ride service: you call for exactly as many cars as you need this afternoon. A batch service is the dispatcher that decides which car carries which package.
What a cloud batch service adds
Renting machines alone is not enough. Someone still has to decide how many to rent, start the software on each, hand out work, notice failures, retry, and release machines at the end. Early cloud users wrote this glue code themselves, and each team wrote a slightly different, slightly buggy version. Azure Batch packages that glue as a service: the queue, the dispatcher, the machine lifecycle, retries, and a standard way to describe work. Similar services exist on other clouds, such as AWS Batch and Google Cloud Batch, which shows how general the need is.
Batch or a cloud-hosted classic scheduler?
Some organizations already have scientific code and scripts written for Slurm or PBS. Rewriting them for a new service can be costly. For these teams Azure offers a different product, Azure CycleCloud, which builds and manages clusters running those familiar schedulers on Azure machines. The choice is therefore partly about habit and partly about control. Azure Batch is a good match when you are starting fresh, want no scheduler to operate, or are building a product that submits work through an API. CycleCloud is a good match when researchers expect to log in and submit scripts the way they always have.
| Era | Typical approach | Main pain |
|---|---|---|
| Owned cluster | Fixed servers with a scheduler such as Slurm or PBS | Idle capacity and long queues at peak |
| Grid computing | Link many institutions into a shared pool | Trust, software and data location problems |
| Early cloud | Rent VMs and write your own scheduling glue | Every team rebuilds the same fragile code |
| Managed batch service | Describe jobs and let the service manage machines and queue | Learning the model; designing data flow and cost |
Most surprising behaviors in Azure Batch, such as tasks being requeued, nodes being thrown away and jobs being bound to pools, are direct inheritances from cluster scheduler design. When something feels odd, ask what a shared cluster would have done.
3Core Concepts: The Vocabulary You Need
Azure Batch has only a handful of building blocks. Learn these seven words and every diagram in this guide will make sense.
Batch account
Your home inside the service. It lives in one Azure region, holds your pools, jobs and settings, and gives you a URL to talk to. Think of it as your account at the staffing agency.
Pool
A group of virtual machines that all share the same size and the same operating system image. It is your team of cooks, ready and waiting.
Node
One virtual machine inside a pool. Each node runs a small helper program called the node agent that talks to the Batch service and starts your work.
Job
A container for tasks. A job is attached to one pool and says how the tasks inside it should behave: priority, retry rules and when to finish.
Task
One unit of work: usually a single command line to run on a node, such as “convert this video” or “simulate scenario 4,812”.
Resource and output files
Resource files are inputs copied onto the node before the task starts. Output files are results copied off the node, usually into Azure Storage, when the task ends.
Start task and application package
A start task prepares each node once, when it joins the pool. An application package is a versioned zip of the software your tasks need, stored by Batch and unpacked on nodes.
How the pieces relate
The relationships are simple to remember. An account has many pools. A pool has many nodes. A job points at one pool. A job has many tasks. A node can run tasks from any job that points at its pool. Pools and jobs are separate on purpose: the pool is the long-lived hardware, while jobs come and go.
| Concept | What it is | How long it lives | Analogy |
|---|---|---|---|
| Batch account | Regional container and entry point | Months to years | Agency membership |
| Pool | Set of identical VMs | Minutes to months | Team of cooks |
| Node | One VM with a node agent | While the pool wants it | One cook |
| Job | Group of related tasks bound to a pool | Minutes to days | One catering order |
| Task | A command line plus its files | Seconds to hours | One recipe card |
The word “batch” also means batch processing in general, which is any work done in groups rather than one request at a time. Azure Batch is a specific Azure service for running that kind of work. Other Azure products, such as Data Factory and Synapse, also do batch-style processing but follow different models.
4Architecture and Components
Seeing the whole system on one page makes every later chapter easier. The picture below shows who talks to whom.
flowchart LR U["Your application or scheduler"] -->|"1 Submit jobs and tasks via REST or SDK"| API["Batch Service API with Entra ID sign in"] API --> SCH["Batch scheduler and pool manager"] SCH -->|"2 Create, resize and heal VMs"| ARM["Azure compute fabric"] ARM --> P["Pool of compute nodes"] SCH -->|"3 Assign ready tasks to free slots"| P ST["Azure Storage Blob and Files"] -->|"4 Download resource files"| P P -->|"5 Upload output files"| ST P -->|"6 Report task state and node health"| SCH SCH -->|"7 Status and results"| U MON["Azure Monitor and Log Analytics"] -.-> SCH MON -.-> P
The Batch service: the brain
Everything you do goes through the Batch service endpoint of your account. It keeps the official record of every pool, node, job and task. It holds the queue of tasks that are waiting. It decides which task goes to which node. And it talks to the Azure compute fabric, the layer that actually creates and deletes virtual machines. You never log in to this brain. You talk to it through a REST API, through client libraries for languages such as .NET, Python, Java, JavaScript and Go, through the Azure CLI, or through the Azure portal and a free desktop tool called Batch Explorer.
Compute nodes: the muscle
Every node is an ordinary Azure virtual machine. Its operating system image comes from the Azure Marketplace, from your own Azure Compute Gallery, or from a custom image you built. A small node agent runs on each machine. It regularly tells the service “I am alive and I have free capacity,” receives tasks, downloads their files, starts the command, watches it, and reports the exit code. If the node agent stops reporting, the service eventually marks the node unusable and moves its work elsewhere.
Azure Storage: the filing cabinet
Nodes are temporary. When they disappear, their local disks disappear. Therefore real inputs and outputs live in Azure Storage, most often Blob Storage, sometimes Azure Files for shared folders. A Batch account can also be linked to a storage account so that application packages have somewhere to live.
Identity, network and monitoring around the edges
Three more parts sit around the core. Microsoft Entra ID decides who may call the Batch API. A virtual network, if you choose to use one, decides how nodes reach other systems. Azure Monitor collects metrics and logs. We cover each in detail in later chapters.
Two ways to allocate the machines
When you create a Batch account you choose a pool allocation mode. In Batch service mode, the virtual machines are created in subscriptions owned by Microsoft and capacity is counted against quotas on your Batch account. In user subscription mode, the virtual machines are created inside your own Azure subscription, so they count against your subscription quotas, you can use your own reservations and discounts, and you see them as resources in your tenant. User subscription mode needs a Key Vault in the setup and is the usual choice for companies with strict governance rules.
Cores are limited per region and per VM family, and the number of pools and jobs is limited per account. A pool request that asks for more cores than your quota allows will stop growing and report an error. Ask for quota increases well before launch day, not during it.
5Pools in Depth: Choosing and Shaping Your Machines
A pool is where most design decisions live. Get the pool right and the rest of the system is easy.
What defines a pool
Every pool has a fixed list of properties that are chosen when the pool is created. The most important are the VM size, the operating system image, the number of nodes you want, a start task if any, the network settings, and the rules for how many tasks may run on one node at once. Because one pool means one VM size, workloads that have very different needs, such as a memory-hungry step and a light step, are normally given separate pools.
Picking a VM size
Azure offers families of machines tuned for different jobs. General purpose sizes balance processor and memory. Compute optimized sizes give you more processor power per dollar. Memory optimized sizes suit large datasets that must stay in memory. GPU sizes serve machine learning and video work. High performance computing sizes, often called H-series, add very fast networking such as InfiniBand for tightly connected simulations. The practical method is to measure one task on two or three sizes, calculate cost per finished task rather than cost per hour, and pick the size that wins.
Choosing a VM size is like choosing a vehicle for a moving day. A van is cheap and fine for boxes. A truck costs more per hour but moves a house in fewer trips. The cheapest vehicle per hour is not always the cheapest way to finish the move.
Task slots and packing
A node with eight cores does not have to run one task at a time. A pool setting called task slots per node tells the service how many tasks may run in parallel on each node. Setting it to one gives every task the whole machine. Setting it to eight lets eight single-core tasks share it. A task can also ask for more than one slot when it needs a larger share. A second setting, the task scheduling policy, chooses between spread, which fills tasks evenly across nodes, and pack, which fills one node completely before using the next. Pack makes it easier for autoscale to remove empty nodes later.
Operating system images
Each node boots from an image. You can start from a Marketplace image and install your software during a start task, which is simple but slows every new node. A better option for large or frequently resized pools is a custom image stored in Azure Compute Gallery with your software already installed. New nodes then become ready in a few minutes instead of many. Another option is to keep the image plain and run your work in containers.
The start task
A start task is a command that runs once on every node when it joins the pool or reboots. It prepares the machine: installing a runtime, mounting a file share, or warming a cache. The pool can be told to wait for the start task to succeed before sending any work. If it fails, the node is marked as having a failed start task and is not used, which protects you from running tasks on half-prepared machines.
Application packages and mounted storage
For software you build yourself, an application package is a versioned zip uploaded to your Batch account. You attach a package version to a pool or a task, and Batch downloads and unzips it on the node. For shared data, a pool can mount Azure Files, Blob Storage through a file system adapter, or an NFS share, so every node sees the same folders.
Node states you will see
| State | Meaning | What to do |
|---|---|---|
| Creating or starting | VM is being allocated and booted | Wait; long waits point to quota or capacity issues |
| Waiting for start task | Setup command is running | Check the start task output if this takes long |
| Idle | Ready and free | Nothing; this is the healthy resting state |
| Running | At least one task is executing | Nothing |
| Unusable | Node agent cannot be reached or the VM is broken | Batch will replace or remove it; investigate if it repeats |
| Start task failed | Setup command did not succeed | Fix the start task, then reboot or reimage the node |
| Preempted | A Spot node was taken back by Azure | Tasks are requeued; ensure work can be repeated safely |
6Jobs and Tasks: How Work Is Described and Scheduled
Pools are the machines. Jobs and tasks are the work. This chapter explains what you can say about the work and what Batch does with it.
Jobs
A job groups tasks and ties them to a pool. It carries settings that apply to all of its tasks: a priority between minus one thousand and one thousand, a flag that allows task dependencies, a default retry limit, and an option to end the job automatically when every task is finished. A job can also create its own temporary pool, called an auto pool, which is built when the job starts and removed when it ends. Auto pools are convenient for one-off runs, but they pay the cost of node startup every time.
Two special helper tasks exist at job level. A job preparation task runs once on each node before that node’s first task for the job, which is useful for copying shared reference data. A job release task runs when the job ends, to clean up. There is also the job manager task, which is the first task to start and whose job is to create all the other tasks. It lets the cluster itself generate its own work list, so your laptop does not have to stay online.
Tasks
A task is a command line plus the settings around it. It names the files to download before it starts, the environment variables it needs, the output files to upload after it ends, the user account it runs as, and its limits. Important limits include the maximum wall clock time, which stops a stuck task, the maximum retry count, and the retention time, which says how long the task’s folder is kept on the node after it finishes and defaults to seven days. Tasks may run as an automatic temporary user with or without administrator rights, or as a named user.
What the scheduler does
The scheduling loop is easy to picture. The service holds all tasks that are active, meaning waiting. It looks for nodes that are idle and have a free slot. It considers job priority first, so a higher priority job gets nodes sooner, and then the order in which tasks were added. It hands each ready task to a node. The node agent downloads resource files, which puts the task in the preparing state, then starts the command, which puts it in running. When the command ends, the task becomes completed, and that state holds both success and failure. Whether it worked is told by the exit code and a separate result field.
stateDiagram-v2 [*] --> Active Active --> Preparing : Node and slot found Preparing --> Running : Resource files ready Running --> Completed : Command exits Completed --> Active : Retry allowed after failure Running --> Active : Node lost or preempted so task requeued Completed --> [*]
Retries and failure handling
Failures come in two flavors. In the first, your command exits with a non-zero code. If you allowed retries, Batch puts the task back in the queue and tries again, up to the limit. Setting the limit to minus one means unlimited retries, which is rarely wise. In the second flavor, the machine itself disappears, as with a Spot eviction or a crashed node. Here Batch requeues the task automatically and runs it again from the start. Because of this second case, every task should be written so that running it twice gives the same answer. Experts call that idempotent. A simple way to get there is to write results to a file name that depends only on the task’s input, so a second run simply overwrites the first.
Exit conditions
You can describe what Batch should do for particular exit codes. For example, exit code two might mean “bad input, do not retry,” while exit code seventy-five might mean “temporary problem, retry.” You can also tell a job to terminate the whole job if one important task fails, which saves money when later work would be pointless.
Create the pool
Choose size, image and node count. Nodes boot and run their start task.
Create the job
Bind it to the pool and set priority, retry defaults and auto-completion.
Add the tasks
Add many tasks, often in groups, each with its own inputs and outputs.
Let the scheduler work
Tasks move from active to preparing to running to completed on free slots.
Collect and clean up
Read results from storage, then delete the job and shrink or delete the pool.
7Inside the Service: Scheduling Rules, Heartbeats and Self-Healing
The previous chapter described what you can ask for. This one describes what the service does with your request, using only behavior that is visible through its public API and documentation.
The service keeps the official record
Every pool, node, job and task is a record held by the Batch service, not by your application and not by the nodes. That fact explains a lot. Your program can crash and restart and the work continues, because the service still knows which tasks are active and which are done. A node can vanish and the service still knows which task it was running and can return that task to the queue. The nodes are workers; the service is the memory.
Heartbeats and node health
Each node agent regularly reports to the service. If the reports stop for long enough, or the agent reports that the machine is unhealthy, the node is marked unusable. Its running tasks are requeued. Batch often recovers such nodes by itself, and when it cannot, you can reboot a node, reimage it back to a clean state, or remove it from the pool so a replacement is created if the pool target still calls for one. You can also disable scheduling on a single node, which keeps it in the pool but stops new tasks reaching it. This is the polite way to take a suspicious node out of service while you investigate, because it lets current tasks finish.
Rules for choosing the next task
Three rules decide who runs next. First, a job with a higher priority value is considered before a job with a lower one. Second, among tasks of the same priority, earlier tasks generally go first, so a queue behaves roughly like a line. Third, a task is placed only on a node that has enough free task slots and that satisfies any special conditions, such as being part of a multi-instance group. An important detail is that a higher priority job does not interrupt tasks that are already running. It simply gets the next free slots. If you need an urgent job to run immediately on a full pool, you must add capacity or use a separate pool.
Teams often set an emergency job to the top priority and expect it to push everything else out of the way. It will not. Long tasks already holding slots keep them until they end. Plan separate capacity for urgent work.
Pool resizing
A pool has an allocation state that tells you whether it is steady, resizing or stopping a resize. When the target number of nodes changes, the service asks Azure for machines and the pool enters the resizing state. A resize timeout, fifteen minutes by default, limits how long the service will keep trying to reach the target. If it cannot get all machines in that time, because of quota or capacity, it stops and reports resize errors, and the pool keeps whatever nodes it did obtain. A pool with errors is not broken; it is simply smaller than you asked, and the error tells you why.
Steady
The pool has reached its target or is not trying to change. This is the normal resting state.
Resizing
The pool is adding or removing nodes. Tasks can already run on nodes that are ready.
Stopping
A resize is being cancelled, typically after you request it or after a timeout.
Spreading across failure zones
In regions that support availability zones, a pool can be configured to place its nodes across zones. A problem in one zone then affects only part of the pool, and the rest continues. Spreading is a choice you make when you create the pool and cannot be changed afterward, so it is worth deciding early for pools that carry important work.
What happens when a task runs on a node
When the service assigns a task, the node agent creates a folder for it, downloads the resource files, sets environment variables, starts the command under the chosen user account, and keeps watching it. The agent collects the exit code and the timestamps, then uploads outputs. Time spent in each step is recorded in the task information, so you can see how long downloading, running and uploading each took. This breakdown is the quickest way to find out whether your slow job is slow because of computing, storage or scheduling.
8Data Flow and Lifecycle: Following One Run from Start to Finish
Computing power is only half of the story. Most Batch bugs and delays come from how data gets onto the nodes and back off again.
The standard path of data
Think of a node as a temporary workbench. Before work begins, materials are carried in. After work ends, finished goods are carried out. Then the bench is cleared. In Azure Batch the materials are resource files, the finished goods are output files, and the carrying is done by the node agent. Resource files can point to a blob, to a whole blob container or folder prefix, or to a web address. Output files are described by a pattern such as “everything in the results folder” and a destination such as a blob container, plus a trigger that says when to upload: when the task succeeds, when it fails, or whenever it completes.
flowchart TD
A["Input data lands in Blob Storage"] --> B["Client or job manager adds tasks with resource file references"]
B --> C["Scheduler picks a node with a free slot"]
C --> D["Node agent downloads resource files to the task working folder"]
D --> E["Task command runs and writes results locally"]
E --> F{"Exit code zero?"}
F -->|"Yes"| G["Node agent uploads output files to Blob Storage"]
F -->|"No"| H["Upload logs on failure then retry or fail the task"]
G --> I["Task marked completed"]
H --> I
I --> J["Downstream step or user reads results from Storage"]
How nodes are allowed to read storage
Nodes need permission to touch your storage account. There are two common ways. The older and simpler way is a shared access signature, often shortened to SAS: a web address with a signed token that allows a specific action on a specific blob or container for a limited time. The more modern way is a managed identity attached to the pool. The node proves who it is to Azure without any secret in your code, and storage permissions are granted to that identity through role assignments. Managed identity avoids leaking tokens in logs and removes the headache of expiring signatures in the middle of a long job.
A SAS token that expires after one hour will quietly break a pool that lives for a day, because new nodes and retried tasks will try to download files with a dead token. Give tokens lifetimes longer than the whole job, or better, use managed identity.
Where files live on the node
Every task gets its own working folder on the node’s local disk. Resource files land there. The command runs inside it. A few shared locations exist too: a folder for the job preparation task, a folder for application packages, and a shared folder that every task on the node can read. Local temporary disks are fast but small, so large datasets should be streamed or mounted instead of copied wholesale into every task folder.
The lifecycle of everything, in order
Provision
The pool asks Azure for virtual machines. This is usually the slowest step, taking from a couple of minutes to longer if capacity is tight.
Prepare
Start task runs, packages unpack, shares mount. Nodes turn idle and ready.
Execute
Tasks flow through preparing, running and completed. Failed tasks are retried or reported.
Harvest
Output files are uploaded and your downstream system collects them.
Release
Job release tasks clean up. Autoscale or your script shrinks the pool to zero.
Retire
Completed tasks and jobs are deleted after you no longer need their history.
Task retention and logs
After a task ends, its folder, standard output file and standard error file stay on the node until the retention time passes or the node is removed. That means you can still fetch logs for a failed task, but only while the node exists. If your pool shrinks quickly, the evidence vanishes with it. For anything important, upload logs as output files using the failure trigger so you always have them in storage.
A node is like a hotel room rented for a short stay. You bring your own bags in, do your work, and carry your bags out. Anything you leave behind is gone once housekeeping resets the room. Storage is the safe at the front desk, which stays put after you check out.
9Beyond Simple Tasks: Dependencies, Multi-Instance Work and Containers
Once the basics feel natural, Azure Batch offers several features that cover more complicated workloads.
Task dependencies
Some work has an order. You cannot merge results before the pieces are computed. When a job is created with dependencies enabled, each task can list the tasks it waits for, either by name or by a range of numbered task identifiers. A waiting task stays blocked until all of its parents have finished successfully. If a parent fails, you can choose whether the child is released anyway or is blocked forever, using exit conditions. This lets you express a small pipeline, such as split, process in parallel, then merge, without any external workflow tool.
Multi-instance tasks for tightly coupled work
Not all parallel work is a pile of independent pieces. In weather models and engineering simulations, many processes must talk to each other constantly while they run. The standard way to build such programs is a library called MPI, short for Message Passing Interface. A multi-instance task in Azure Batch runs one task across several nodes at once. You name how many nodes you need. Batch picks a group, runs a coordination command on each one to get them ready, and then runs your main command, which typically starts the MPI program. For the best speed, this feature is paired with high performance VM sizes that have very fast network links.
Container tasks
Instead of installing software on the node, you can package it in a container image. A pool can be configured with a container runtime and a list of images to prefetch from a registry such as Azure Container Registry or Docker Hub. A task then names the image it wants and Batch runs the command inside that container. Containers make results more repeatable, avoid the “works on my machine” problem, and let different jobs on the same pool use different software versions side by side.
A container is a lunchbox. The cook at each node does not need to know what is inside or how it was made. They open the box, heat it, and serve it. Swap the box and you get a different meal, without changing the kitchen.
Job schedules
A job schedule creates new jobs on a timetable: once at a set time, or repeatedly, such as every night at two. Each run is a fresh job built from a template, with its own tasks. This is the built-in way to run recurring work like nightly reports or end-of-day risk calculations.
The job manager pattern in practice
A job manager task is a clever way to avoid depending on the machine that submitted the work. Imagine uploading ten thousand input files and then starting a job whose only first task reads the list from storage and creates ten thousand child tasks directly inside the cluster. If your laptop disconnects, the work carries on. If the manager task itself fails, Batch restarts it, and a well written manager checks which child tasks already exist before adding more.
| Feature | Use it when | Watch out for |
|---|---|---|
| Task dependencies | Small pipelines with a clear order | Large, complicated graphs are easier in a dedicated workflow engine |
| Multi-instance tasks | MPI and other tightly coupled programs | All nodes must be free at once, which can slow scheduling |
| Container tasks | Repeatable software, mixed versions on one pool | Large images slow first startup unless prefetched |
| Job schedules | Nightly or weekly recurring runs | Overlapping runs if one takes longer than the interval |
| Job manager task | Self-driving jobs that create their own tasks | Must be safe to restart without duplicating tasks |
10Scaling and Cost: Autoscale, Spot Capacity and Right-Sizing
The big promise of the cloud is paying only for what you use. Azure Batch gives you three levers to keep that promise: how many nodes, what kind of nodes, and how well each node is used.
Fixed size versus automatic scaling
A pool can be fixed, which means you set a target node count and change it by hand or by a script. Or it can use automatic scaling, which means you write a small formula and Batch re-evaluates it on a timer. The formula can read metrics such as the number of active tasks, the number of running tasks, and processor use, as well as the time of day. A common formula says: “Look at how many tasks are waiting and running. Aim for one node for every few tasks, never go above a ceiling, and fall to zero when there is nothing to do.” The evaluation interval defaults to fifteen minutes and can be set as low as five.
When the formula wants to shrink the pool, you also choose what happens to nodes that are still busy. You can requeue their tasks right away, terminate them, wait for running tasks to finish, or wait until the data held on the node has been retained for its time. The safe default for long tasks is to wait for them to finish.
An idle pool still costs money. A pool that scales to zero between runs costs almost nothing while quiet. The trade is a slower start next time, because nodes must boot again. If a user is waiting, keep a small warm minimum. If the work is a nightly batch, go to zero.
Dedicated nodes and Spot nodes
Regular nodes, called dedicated nodes, are yours until you release them. Spot nodes use spare Azure capacity at a large discount, up to about ninety percent below normal prices, but Azure can take them back with short notice when it needs the capacity. The older “low-priority” node type that Batch used for the same idea has been phased out in favor of Spot VMs, so check the current documentation for the options in your account type. When a Spot node is taken away, its tasks are requeued and run again elsewhere, which is why idempotent tasks matter so much. The most popular design is a small dedicated base plus a large Spot layer, so the job always finishes even when Spot nodes come and go.
Dedicated nodes
- Stay until you remove them
- Predictable finishing time
- Suit deadlines and long tasks that are hard to repeat
Spot nodes
- Can be evicted at any time
- Capacity is not guaranteed in every region and size
- Poor fit for very long tasks without checkpoints
Making tasks Spot-friendly with checkpoints
A long task that takes six hours is risky on Spot. If it is evicted at hour five, you lose five hours of work. A checkpoint is a saved snapshot of progress written regularly to storage. When the task is started again on another node, it first looks for a checkpoint and continues from there. Alternatively, you can split one six-hour task into thirty-six ten-minute tasks, which also finishes sooner because more nodes can help.
Right-sizing and utilization
The cheapest improvement is often simply keeping nodes busy. If tasks use only one of eight cores, raise the task slots per node to eight. If tasks spend half their time waiting for downloads, make downloads faster or overlap them with processing. If a pool has one hundred nodes but only thirty tasks, the extra seventy are pure waste. Measure utilization per node, not just total cost.
Reducing wait time at the start
Time to get nodes ready is a hidden cost, especially for short jobs. Ways to reduce it include using custom images with software preinstalled, prefetching container images, keeping a small warm pool, and reusing one pool for many jobs instead of building a new one each time. For a job that finishes in five minutes, a pool that takes ten minutes to start is the real problem.
| Lever | Saves | Costs you |
|---|---|---|
| Autoscale to zero | Idle compute spend | Cold start delay |
| Spot nodes | Large share of VM price | Evictions and retries |
| Higher task slots | Number of nodes needed | Tasks compete for memory and disk |
| Custom image | Node startup minutes | Image build and update effort |
| Reservations or savings plans on a steady base | Unit price of always-on nodes | Commitment length |
11Capacity Planning: A Worked Example with Real Arithmetic
Guessing pool sizes wastes money or misses deadlines. A few lines of arithmetic give a defensible starting point. The prices below are made-up round numbers for illustration, not Azure’s price list.
The scenario
A team must process 200,000 input files. Each task uses one processor core for six minutes and downloads a 200 megabyte input file. They want everything done in about five hours and plan to use nodes with eight cores each, running eight tasks per node at the same time.
Step 1: total work
Multiply the task count by the task length: 200,000 tasks times six minutes is 1,200,000 core-minutes. Divide by sixty to get 20,000 core-hours. This is the amount of work, independent of how many machines share it.
Step 2: add overhead
Real tasks also spend time downloading, uploading and sometimes being retried. Suppose measurement on a small test shows about ten percent overhead. The work becomes 22,000 core-hours.
Step 3: cores needed for the deadline
Divide the work by the time allowed. 22,000 core-hours spread across five hours needs 4,400 cores running at the same time. With eight cores per node, that is 550 nodes. The same figure can be reached with Little’s law from queueing theory: the number of tasks running at once equals the rate at which tasks finish multiplied by how long each takes. If 200,000 tasks finish over 300 minutes, about 667 finish every minute, and with a seven minute average including overhead, around 4,670 are in flight, which agrees closely with our estimate.
| Step | Calculation | Result |
|---|---|---|
| Total work | 200,000 tasks x 6 minutes | 1,200,000 core-minutes, or 20,000 core-hours |
| With overhead | 20,000 x 1.10 | 22,000 core-hours |
| Cores for 5 hours | 22,000 / 5 | 4,400 cores |
| Nodes at 8 cores | 4,400 / 8 | 550 nodes |
| Node-hours | 550 x 5 | 2,750 node-hours |
| Illustrative dedicated cost | 2,750 x $0.40 per node-hour | $1,100 |
| Illustrative Spot cost | 2,750 x $0.12 per node-hour | $330 |
Step 4: check the other limits
Cores are only one of the limits. Check each of them before launching.
Core quota
4,400 cores in one VM family and region must be allowed on your account or subscription. If your quota is smaller, the pool will stop growing at that number.
Data volume
200,000 files of 200 megabytes is about 40 terabytes. Over five hours that is around 2.2 gigabytes per second of reads, which is near what one storage account may sustain, so spread data across accounts or containers.
Ramp-up time
Allocating 550 machines and running a start task may take ten to twenty minutes, so plan about five and a half hours, not five.
Node disk space
Eight tasks per node each holding a 200 megabyte input plus outputs needs several gigabytes per node, well within normal local disks, but check output sizes.
Step 5: reduce risk with a mixed pool
Suppose the team uses 150 dedicated nodes and 400 Spot nodes. The dedicated nodes alone could finish the job in about 18 hours, so even if every Spot node is evicted, the job still completes, just later. In the normal case Spot capacity brings it down to about five hours. The expected cost then lies between the two illustrative figures above, and the worst case is bounded and known in advance. That is the kind of statement a manager can approve.
Step 6: let autoscale follow the queue
Rather than setting 550 nodes by hand, the autoscale formula can look at pending tasks. At eight tasks per node, 550 nodes handle 4,400 tasks at once. As the queue shrinks toward the end, the formula reduces the target to match, so you do not pay for hundreds of idle machines while the last tasks finish. Using the pack scheduling policy makes shrinking cleaner, since tasks gather on fewer nodes and the empty ones can be removed first.
Do the arithmetic, then run a few hundred real tasks to measure task time, overhead and failure rate. Replace the guessed numbers with measured ones and calculate again. Estimates built on measurements are usually within ten or twenty percent.
12Networking and Security
A Batch pool runs your code on many machines that can reach data. That makes security worth designing deliberately instead of adding later.
Who may call the service
There are two ways to authenticate to the Batch API. Microsoft Entra ID is the recommended way: a person or an application signs in, receives a token, and Azure role-based access control decides what they may do. Built-in roles for Batch let you separate people who manage the account from people who only submit jobs or only read status. The older shared key method uses a long secret that grants full access to the account, so it is harder to restrict and audit. New designs should avoid it where possible.
Who the nodes are
Nodes should have an identity of their own. A user-assigned managed identity can be attached to a pool so that tasks reach Storage, Key Vault, container registries and databases without embedding secrets. Permissions are granted to that identity by role, and you can narrow them to the exact container or secret needed. The former Batch “certificates” feature, which pushed certificate files to nodes, has been retired. Store secrets and certificates in Key Vault and fetch them with the managed identity instead.
Where nodes live on the network
By default, pool nodes sit in a network managed by the service and receive public addresses. For stricter environments you place the pool inside your own virtual network and subnet. Then network security groups control traffic, user-defined routes can send outbound traffic through a firewall, and private endpoints let nodes reach Storage and Key Vault without ever crossing the public internet. The account itself can also have private endpoints so that job submission and node management stay on private paths. Pools can be created without public IP addresses, in which case nodes need outbound access to the Batch service through a simplified communication model, usually via private link or a controlled outbound route.
flowchart LR
subgraph Corp["Your virtual network"]
CL["Job submitter in your app"]
subgraph Sub["Pool subnet with NSG"]
N1["Compute node 1"]
N2["Compute node 2"]
end
PE1["Private endpoint to Batch account"]
PE2["Private endpoint to Storage"]
PE3["Private endpoint to Key Vault"]
end
CL --> PE1
N1 --> PE1
N2 --> PE1
N1 --> PE2
N2 --> PE2
N1 --> PE3
PE1 --> BA["Batch account"]
PE2 --> SA["Storage account"]
PE3 --> KV["Key Vault"]
Protecting the data
Data at rest in Storage is encrypted by default, and you can bring your own keys. Node disks can be encrypted as well, and the Batch account can use customer-managed keys for its own encryption. Data in transit uses TLS. Beyond encryption, the key habits are least privilege, short-lived access, and keeping secrets out of command lines, since command lines are stored and shown in task details.
Isolating tenants and workloads
If one pool runs trusted code from your team and another runs code supplied by outside users, put them in separate pools, ideally separate accounts and networks. Within a pool, tasks run under a user account on the node. Using the non-administrator automatic user keeps one task from tampering with another. Containers add another wall but do not replace careful account separation when code is untrusted.
Anyone holding an account key can create pools of expensive machines. A leaked key can produce a large bill within hours. Prefer Entra ID, rotate any key that must exist, and set quota limits so a mistake cannot grow without bound.
13Monitoring, Logging and Metrics
A cluster that runs thousands of tasks while you sleep needs a clear dashboard. Four sources of truth cover almost every question.
Source 1: the service’s own state
The Batch API and portal show the state of every pool, node, job and task, with counts such as active, running and completed tasks, plus failure details like exit code, failure category and the scheduling error if the task never started. This is the first place to look when something seems stuck. Batch Explorer presents the same information in a friendly desktop view and lets you browse files on nodes.
Source 2: Azure Monitor metrics
The Batch account publishes metrics to Azure Monitor, such as the number of nodes in each state, the number of tasks in each state, and counts of pool resize and task events. You can chart these, build dashboards and create alerts. A useful alert is “tasks active for more than thirty minutes while idle nodes equal zero,” which tells you capacity or quota is the problem.
Source 3: diagnostic logs and events
Batch can send service logs to Log Analytics, a storage account or an event hub. These logs include events such as pool create, pool resize start and complete, task start, task complete and task fail. With a few queries you can answer questions like “which tasks failed last night, on which node size, with which exit code?” In addition, Batch emits events you can subscribe to through Event Grid to trigger follow-up actions when a job completes.
Source 4: what your tasks write
Each task has a standard output and standard error file on its node. These are your main debugging tool. Because they live on the node, remember to upload them as output files on failure. For deeper insight, applications can send their own telemetry to Application Insights, and a tool called Batch Insights can collect per-node processor, memory, disk and network figures for a pool.
Why is nothing running?
Check pool allocation errors, quota, and whether nodes are stuck in start task failed or waiting for start task.
Why are tasks failing?
Group failures by exit code and node size. A single bad node shows up as many failures on one machine.
Why is it slow?
Compare download time, run time and upload time. Slow storage often hides behind a busy cluster.
Why is it costly?
Look at node hours against task hours. A large gap means idle nodes or poor packing.
When thousands of tasks write logs at once, a message without a task identifier is almost useless. Write the job name, task name and input name at the start of every line so one search finds a whole story.
14Failure Scenarios and Recovery
In a system with thousands of machines, something is always failing somewhere. What matters is whether the failure is expected, visible and cheap to recover from.
A catalog of common failures
| Scenario | What you see | Recovery |
|---|---|---|
| Spot node evicted | Node state preempted; tasks return to active | Automatic requeue. Make tasks repeatable and use checkpoints for long ones |
| Node becomes unusable | Node marked unusable; its tasks requeued | Wait for self-recovery, or reboot, reimage or remove the node |
| Start task fails | Nodes sit in the start task failed state, no tasks run | Read the start task output, fix the command, reboot or reimage the nodes |
| Quota or capacity shortage | Pool stays smaller than target with resize errors | Request quota, try another VM size or region, or lower the target |
| Poison task | One bad input fails again and again | Cap retries, use exit conditions, send the input to a review area |
| Storage throttling | Downloads slow or fail across many nodes at once | Spread data over accounts or containers, add retries with backoff, cache shared files |
| Expired access token | New downloads or uploads fail with authorization errors | Switch to managed identity or issue longer lived tokens |
| Job manager task fails | No new tasks are created | Batch retries it; make the manager safe to restart without creating duplicates |
| Retired base image | New pools cannot be created from an older image | Move to a current image or rebuild your custom image on a supported base |
Designing for expected failures
The first defense is making every task safe to run again. Write output to names derived from inputs, check whether the result already exists before doing expensive work, and avoid actions that cannot be undone, such as sending an email in the middle of a task. The second defense is limits. A maximum run time stops stuck tasks, and a retry cap stops endless loops. The third defense is visibility: alerts that trigger when tasks stay active while no node is working, or when failure counts jump.
Poison tasks and the dead letter idea
A poison task is one that will never succeed, such as a corrupt input file. Left alone, it uses retries and clutters results. A common remedy borrowed from messaging systems is a dead letter area. When a task exits with a code that means “this input is bad,” an exit condition tells Batch not to retry, and the task writes the input name into a review folder. People look at those items later without holding up the rest of the run.
A post office sorting room has a tray for letters with unreadable addresses. Staff do not keep trying to deliver them all day. They put them in the tray, continue with the normal mail and ask a person to look at the tray before closing time.
Disaster recovery across regions
A Batch account lives in a single region. If that region has a serious outage, the account and its pools are unavailable. For work that must continue, teams keep a second account in another region with matching quotas, replicate their input data and images there ahead of time, and keep deployment scripts that can create the pools quickly. Because jobs are usually short and defined by code, the recovery step is often just “run the same submission against the second account.” It is cheaper to keep the second site empty and ready than to keep it running, provided you rehearse the switch.
A calm recovery routine
Look at the pool first
Check the allocation state, resize errors and node states. Many problems end here.
Sample failed tasks
Read the exit code, failure information and output files of three or four failures. Look for a pattern in node, input or time.
Contain the damage
Disable scheduling on bad nodes, pause the job if tasks are failing quickly, and avoid burning retries.
Fix the cause
Correct the start task, image, permission or input. Test on one node.
Resume and record
Re-run failed tasks only, then write down what happened so the next run is better prepared.
15Advantages, Disadvantages and Trade-offs
No service fits every problem. Knowing where Azure Batch shines and where it struggles is what separates a good design from an expensive one.
Advantages
- No scheduler or cluster software to install, patch or repair
- Pay only while nodes exist, billed by the second for most sizes
- Scales from a handful to thousands of nodes within your quota
- Supports Linux and Windows, containers, GPUs and high performance networking
- Built-in retries, requeue on node loss, dependencies and schedules
- Works with Spot capacity for large discounts
- Integrates with Entra ID, virtual networks, Key Vault and Azure Monitor
Disadvantages
- Not built for low-latency, request and response work
- Node startup takes minutes, which hurts very short jobs
- Quotas and regional capacity can limit sudden growth
- Complex workflows need extra tooling on top
- You still own the application code, images and data design
- Debugging is harder once nodes have been removed
- Azure-specific APIs create some lock-in
How Azure Batch compares with nearby choices
| Option | Best at | Trade-off against Batch |
|---|---|---|
| Azure Batch | Large queues of run-to-completion jobs on VMs you choose | You design pools, images and data movement |
| Azure Functions | Short, event-triggered code with no servers to think about | Execution time and resource limits are tighter |
| Azure Kubernetes Service | Mixed workloads, long-running services, custom schedulers | You operate a cluster and its upgrades |
| Azure Machine Learning compute | Training runs with experiment tracking | Built around machine learning, less general |
| Azure Databricks or Synapse Spark | Big data transformations with shared in-memory datasets | Better for data engineering than arbitrary executables |
| AWS Batch and Google Cloud Batch | The same idea on other clouds | Different APIs and pricing; useful for multi-cloud thinking |
The three big trade-offs
Startup time versus cost. Keeping nodes warm makes jobs start fast but costs money while idle. Scaling to zero saves money but makes the first task wait. Throughput versus reliability. Spot nodes make a run cheaper but add retries and uncertainty. Simplicity versus control. Using auto pools and defaults is easy, while custom images, private networks and tuned autoscale formulas take effort but give speed and safety. Match each choice to the shape of your workload, not to a favorite habit.
16Design Patterns and Anti-Patterns
Experienced teams reuse a small set of shapes. Learn these and you will recognize most workloads at a glance.
Patterns that work
Fan-out and fan-in
Split one large input into many small tasks, run them all at once, then use one final task to merge. This is the most common Batch shape and the basis of almost every rendering and simulation run.
Parameter sweep
Run the same program with thousands of different settings, one task per combination, and compare the results. Finance and engineering teams use it for what-if studies.
Queue-fed submission
Events such as new files in Blob Storage trigger a Function or Logic App that adds tasks to a long-lived job. Work arrives continuously and a small autoscaled pool absorbs it.
Job manager driven
A first task builds the task list inside the cluster. The submitter can disconnect and the run stays alive.
Orchestrated by a pipeline
Azure Data Factory or another workflow tool calls Batch for the heavy steps and handles the surrounding logic, retries and alerts.
Base plus Spot layer
A small dedicated group guarantees progress while a large Spot group adds cheap speed. Idempotent tasks make evictions harmless.
flowchart LR IN["Large input in Blob Storage"] --> SPLIT["Splitter task creates N pieces"] SPLIT --> T1["Task 1"] SPLIT --> T2["Task 2"] SPLIT --> T3["Task 3"] SPLIT --> TN["Task N"] T1 --> MERGE["Merge task with dependency on all pieces"] T2 --> MERGE T3 --> MERGE TN --> MERGE MERGE --> OUT["Final result in Blob Storage"]
Anti-patterns to avoid
What it looks like
Creating a million tasks that each run for one or two seconds.
Why it hurts
Every task has overhead: scheduling, downloading files, starting a process and reporting back. When the useful work is shorter than the overhead, most of your money buys bookkeeping.
Better choice
Group many small items into each task so every task runs for at least a few minutes, or process items in a loop inside one task.
What it looks like
Keeping important state only on a node’s local disk.
Why it hurts
Nodes are replaced, evicted and deleted. State stored only there is lost without warning, and tasks that depend on earlier local files cannot move to another node.
Better choice
Treat nodes as disposable. Keep inputs, checkpoints, results and logs in Storage.
What it looks like
Building a brand new pool for every small job, or installing all software during every start task.
Why it hurts
Each new pool waits for virtual machines to be allocated and set up. Repeated setup adds minutes of paid but useless time and increases failure chances.
Better choice
Reuse long-lived pools with autoscale, use custom images or containers, and prefetch what you need.
What it looks like
Using Batch to serve live user requests, or as a replacement for a web service.
Why it hurts
Scheduling and node start are designed for throughput, not for answers in milliseconds. Users will wait and complain.
Better choice
Use App Service, Functions or Kubernetes for the live path and let Batch do the heavy background work behind it.
17Best Practices and Common Mistakes
These habits are collected from teams that run Azure Batch every day. Most of them cost nothing to adopt and prevent expensive surprises.
Habits worth building
Make tasks idempotent
Name outputs from inputs so a repeat run overwrites cleanly. This single habit makes retries, evictions and node failures harmless.
Size tasks sensibly
Aim for tasks that run for minutes rather than seconds, and not for many hours without a checkpoint.
Use managed identity
Let pools prove who they are to Storage and Key Vault. Avoid secrets in command lines and scripts.
Prepare nodes ahead of time
Custom images, containers and prefetching cut start time and make every node identical.
Set limits on every task
Use maximum wall clock time, a sensible retry count and automatic job termination so nothing runs forever.
Ship logs to storage
Upload standard output and error on failure so evidence outlives the node.
Automate cleanup
Delete finished jobs, shrink idle pools to zero and set budgets and alerts so forgotten pools cannot drain money quietly.
Test small, then scale
Run ten tasks on two nodes before running a million tasks on a thousand nodes. Measure first, then multiply.
Common mistakes
Ignoring quotas
The pool never reaches the size you asked for because cores or families are capped. Check and request quota before big runs.
Expiring tokens
A SAS token dies mid-run and new downloads fail. Use long enough lifetimes or managed identity.
Storage as the bottleneck
A thousand nodes pulling the same blob can throttle one storage account. Spread data across containers or accounts and cache shared files.
Unlimited retries
A bug causes the same task to fail forever, burning money. Cap retries and fail fast on bad input.
Forgetting the pool
The job ends, the pool stays at full size all weekend. Use autoscale or an end-of-job shrink step.
One giant pool for everything
Different workloads need different sizes and security. Use separate pools with clear purposes.
18Real-World Usage Examples
Four familiar workloads show how the concepts combine in practice. Numbers below are illustrative, meant to show the shape of the reasoning rather than a particular customer’s setup.
Rendering an animated sequence
A studio has a scene with 14,400 frames. Each frame takes about twelve minutes on one machine, so doing it serially would take 120 days. Using a pool of 600 nodes with rendering software such as Autodesk Maya with Arnold or V-Ray, each node renders frames from its own share and writes images to Blob Storage. The whole sequence finishes in roughly five hours. Spot nodes cover most of the pool, and a small dedicated group makes sure the final frames arrive on time.
Genomics pipeline
A research group aligns thousands of DNA samples. Workflow engines such as Nextflow, which includes an Azure Batch executor, and Cromwell on Azure turn each analysis step into Batch tasks. Container images carry the bioinformatics tools. Autoscale grows the pool when new samples arrive and shrinks it to zero after the run. Intermediate files live in Blob Storage so evicted Spot tasks restart without loss.
Nightly financial risk run
A risk team must evaluate a portfolio under hundreds of thousands of market scenarios every night before markets open. A job schedule starts the work at the close of trading. The scenarios are split into task groups on a pool inside a private virtual network, nodes read inputs through private endpoints, and results are merged by a final task that depends on all the others. A hard deadline means the base is dedicated, with a Spot layer for extra speed.
Media conversion
A video company receives uploads in many formats and needs each title in several resolutions and codecs. Each upload triggers a Function that adds tasks to a long-lived job. Container tasks run the encoder, one task per output format. A pool of GPU or compute optimized nodes scales with the queue. This resembles how large streaming services encode every title into many versions, though they run it on their own infrastructure.
In every example the work is split into pieces, data lives in Storage, nodes are disposable, and the pool grows and shrinks with demand. The industry changes; the design does not.
19Frequently Asked Questions
Short answers to the questions people ask most often when they first meet Azure Batch.
20Summary and Key Takeaways
What to remember about Azure Batch
- It is a managed scheduler plus a managed cluster. You describe the work and the machines; Azure Batch creates the nodes, assigns the tasks and replaces failures.
- Five words carry the whole model. Account, pool, node, job and task. Pools are long-lived machines; jobs and tasks are the work that passes through them.
- Treat nodes as disposable. Keep inputs, checkpoints, outputs and logs in Azure Storage, and write tasks so that running them twice gives the same result.
- Scale to match the queue. Autoscale, a base of dedicated nodes plus Spot capacity, and sensible task slots per node keep cost low without risking deadlines.
- Secure the edges. Prefer Entra ID and managed identity over keys and tokens, place pools in a virtual network with private endpoints when data is sensitive, and keep untrusted code in separate pools.
- Watch it like a production system. Combine service state, Azure Monitor metrics, diagnostic logs and task output, and put task identifiers in every log line.
- Choose it for the right work. Batch fits large piles of run-to-completion jobs. For live requests or complex mixed services, pair it with, or replace it by, other Azure services.