Autoscaling Controller  ·  View 09 of 37  ·  2 · Structure

Actuation Plane

Converge actual towards desired, and survive a capacity API that is rate-limited and failure-prone.

Editable source SVG draw.io All views
Reconcile loop — holds no policy and no opinion about demand Read Desired Capacity the declaration Observed Actual what is serving Derive Delta re-derived each run Safety Bound Check refuse and journal Apply VMSS Adapter Node Pool Adapter Replica Adapter Warm-Pool Attach under 10 s Confirm Health Check LB Registration then it counts Drain Coordinator 120 s deadline Provider protection — every capacity API is rate-limited and failure-prone Throttling Concurrency Cap per provider Backoff + Jitter exponential Circuit Breaker 5 failures Scarcity Zone Fallback ordered list Shape Fallback declared shapes Unmet Demand a signal, not a retry counted as serving open Actuation Plane — Converge Actual Towards Desired Data store Decision point Security / platform Interface / broker Application we own Risk / gap synchronous failure / alternate Actual capacity is observed, never assumed from intent. Repeating a run for unchanged desired capacity changes nothing. v 1.0 · owner Data & AI Global Practice · date 2026-09

Decisions

  • The delta is re-derived from observed actual capacity on every run, never carried forward from what was intended last time.
  • Capacity counts only once it is health-checked and registered with its load balancer or queue subscription.
  • A delta that would breach a declared safety bound is refused and journalled rather than clipped silently.

Numbers

  • Circuit breaker after 5 consecutive provider failures.
  • Drain deadline 120 s per target by default.
  • Warm-pool attach under 10 s; cold provision measured per target and machine shape.

Risks

  • Throttling and scarcity present similarly and are handled oppositely — backoff for one, fallback list then an honest unmet-demand signal for the other. Getting this wrong produces a controller that spins.
  • Idempotency depends on the provider's set-capacity call being idempotent. Where it is not, the adapter carries a request id and reconciles by reading back.