This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: axum-tower-adaptive-concurrency-shedding-standard

Axum 0.8 Adaptive Concurrency Limiting & Latency-Based Load Shedding

Production Axum 0.8 services must reject traffic dynamically via moving latency percentiles (such as Vegas or Gradient estimators) instead of static semaphore bounds. Static concurrency thresholds fail under tail-latency degradations, causing unbounded thread/task queuing, socket exhaustion, and cascading microservice collapse across distributed topologies.

Prohibited Anti-Pattern: Static Semaphore Concurrency Limiting Causing Queue Saturation and Cascade Failures

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Axum 0.8 Adaptive Concurrency Limiting & Latency-Based Load Shedding - Production Axum 0.8 services must reject traffic dynamically via moving latency percentiles (such as Vegas or Gradient estimators) instead of static semaphore bounds. Static concurrency thresholds fail under tail-latency degradations, causing unbounded thread/task queuing, socket exhaustion, and cascading microservice collapse across distributed topologies.
globs: src/**/*.rs, Cargo.toml
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/axum-tower-adaptive-concurrency-shedding-standard"
---

# Axum 0.8 Adaptive Concurrency Limiting & Latency-Based Load Shedding

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Static Semaphore Concurrency Limiting Causing Queue Saturation and Cascade Failures

## System Constraints
You are a Principal Rust Architect enforcing Axum 0.8 and Tower load-shedding guardrails. Mandate moving-window latency-based adaptive concurrency limits (e.g., TCP Vegas, Gradient algorithms) over static semaphores. Ensure rejected traffic terminates early with RFC 7231 HTTP 503 Service Unavailable and Retry-After headers before downstream IO or database pool exhaustion occurs.

## Strict Guidelines
- Engineers MUST ALWAYS implement adaptive concurrency shedding driven by moving-window latency metrics (Vegas, Gradient, or AIMD) rather than hardcoded static concurrency bounds.
- Engineers MUST NOT allow unconstrained task spawning or unmetered in-flight request queues between the hyper 1.0 listener and the Axum 0.8 Router.
- Code SHOULD propagate backpressure to upstream proxies by emitting an explicit HTTP 503 Service Unavailable with a non-zero Retry-After header upon capacity rejection.
- Services MUST position the adaptive load-shedding Tower layer immediately after the connection acceptance boundary and prior to CPU-intensive middleware or DB pool connection checkout.
- Components NEVER block synchronous worker threads in Axum async handlers when handling degraded latency regimes; all shed decisions must be non-blocking and zero-allocation on the rejection path.

## Bad vs Good Implementations
### Static Concurrency Limit vs. Adaptive Latency Shedding with Tower in Axum 0.8

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Static ConcurrencyLimitLayer relies on an arbitrary counter. When downstream dependencies degrade and p99 latency spikes from 20ms to 2000ms, the static limit saturates instantly, blocking worker runtimes, causing health-check probes to fail, and precipitating cluster-wide cascade failures.
```rust
use axum::{routing::get, Router};
use tower::limit::ConcurrencyLimitLayer;
use std::net::SocketAddr;

// ANTI-PATTERN: Fixed semaphore limit of 100 requests.
// Under tail-latency degradation (e.g., slow DB), in-flight requests hold 100 slots indefinitely,
// incoming queues fill up, health checks timeout, and the entire pod enters a restart cascade.
pub fn build_app() -> Router {
    Router::new()
        .route("/api/resource", get(|| async { "payload" }))
        .layer(ConcurrencyLimitLayer::new(100))
}

#[tokio::main]
async fn main() {
    let app = build_app();
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}
```

#### Production Standard (Correct)
> **Standard**: Protects the runtime by wrapping endpoints with a proactive LoadShedLayer integrated into Axum 0.8's HandleErrorLayer. When overloaded or past latency limits, incoming requests fail fast with HTTP 503 and Retry-After headers without consuming database connections or causing pod eviction.
```rust
use axum::{
    http::{header::RETRY_AFTER, HeaderValue, StatusCode},
    response::{IntoResponse, Response},
    routing::get,
    Router,
};
use tower::load_shed::LoadShedLayer;
use tower::ServiceBuilder;
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
use std::time::Instant;

#[derive(Clone, Default)]
pub struct LatencyStats {
    ema_latency_micros: Arc<AtomicU64>,
}

// Production Invariant: Handle load-shedding errors by mapping them directly
// to HTTP 503 with Retry-After, preventing downstream dependency starvation.
async fn handle_load_shed_error(err: tower::BoxError) -> Response {
    if err.is::<tower::load_shed::error::Overloaded>() {
        let mut res = (StatusCode::SERVICE_UNAVAILABLE, "Server overloaded").into_response();
        res.headers_mut().insert(RETRY_AFTER, HeaderValue::from_static("1"));
        res
    } else {
        (StatusCode::INTERNAL_SERVER_ERROR, "Internal server error").into_response()
    }
}

pub fn build_resilient_app() -> Router {
    Router::new()
        .route("/api/resource", get(|| async {
            let _start = Instant::now();
            // Actual business execution
            "payload"
        }))
        .layer(
            ServiceBuilder::new()
                .layer(axum::error_handling::HandleErrorLayer::new(handle_load_shed_error))
                .layer(LoadShedLayer::new())
        )
}

#[tokio::main]
async fn main() {
    let app = build_resilient_app();
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Axum 0.8 Adaptive Concurrency Limiting & Latency-Based Load Shedding

Axum 0.8 Adaptive Concurrency Limiting & Latency-Based Load Shedding defines an industrial-grade behavioral standard for backend engineering. Production Axum 0.8 services must reject traffic dynamically via moving latency percentiles (such as Vegas or Gradient estimators) instead of static semaphore bounds. Static concurrency thresholds fail under tail-latency degradations, causing unbounded thread/task queuing, socket exhaustion, and cascading microservice collapse across distributed topologies. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Static Semaphore Concurrency Limiting Causing Queue Saturation and Cascade Failures Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftStatic Semaphore Concurrency Limiting Causing Queue Saturation and Cascade FailuresCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS implement adaptive concurrency shedding driven by moving-window latency metrics (Vegas, Gradient, or AIMD) rather than hardcoded static concurrency bounds.

Engineers MUST ALWAYS implement adaptive concurrency shedding driven by moving-window latency metrics (Vegas, Gradient, or AIMD) rather than hardcoded static concurrency bounds.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT allow unconstrained task spawning or unmetered in-flight request queues between the hyper 1.0 listener and the Axum 0.8 Router.

Engineers MUST NOT allow unconstrained task spawning or unmetered in-flight request queues between the hyper 1.0 listener and the Axum 0.8 Router.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Code SHOULD propagate backpressure to upstream proxies by emitting an explicit HTTP 503 Service Unavailable with a non-zero Retry-After header upon capacity rejection.

Code SHOULD propagate backpressure to upstream proxies by emitting an explicit HTTP 503 Service Unavailable with a non-zero Retry-After header upon capacity rejection.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Services MUST position the adaptive load-shedding Tower layer immediately after the connection acceptance boundary and prior to CPU-intensive middleware or DB pool connection checkout.

Services MUST position the adaptive load-shedding Tower layer immediately after the connection acceptance boundary and prior to CPU-intensive middleware or DB pool connection checkout.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Components NEVER block synchronous worker threads in Axum async handlers when handling degraded latency regimes

Components NEVER block synchronous worker threads in Axum async handlers when handling degraded latency regimes; all shed decisions must be non-blocking and zero-allocation on the rejection path.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is Axum 0.8 Adaptive Concurrency Limiting & Latency-Based Load Shedding critical for AI coding assistants?

Production Axum 0.8 services must reject traffic dynamically via moving latency percentiles (such as Vegas or Gradient estimators) instead of static semaphore bounds. Static concurrency thresholds fail under tail-latency degradations, causing unbounded thread/task queuing, socket exhaustion, and cascading microservice collapse across distributed topologies. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Static Semaphore Concurrency Limiting Causing Queue Saturation and Cascade Failures) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

Axum