Skip to main content

Overview

The throttle middleware limits the number of concurrent requests being processed, ensuring your application doesn’t get overwhelmed by too many simultaneous operations. Use it when you need:
  • Limit concurrent request processing
  • Prevent resource exhaustion
  • Control server load
  • Queue requests during high traffic

Installation

Quick Start

Configuration

Options

Examples

Simple Throttle

With Backlog

With Timeout

No Backlog (Immediate Rejection)

With OnThrottle Callback

API Reference

Functions

Technical Details

Implementation

The throttle middleware uses a semaphore-based approach to control concurrency:
  1. Semaphore: A buffered channel (chan struct{}) acts as a semaphore with capacity equal to the Limit. Each slot represents permission to process one request concurrently.
  2. Request Flow:
    • When a request arrives, the middleware attempts to acquire a slot from the semaphore (non-blocking)
    • If a slot is available immediately, the request proceeds
    • If no slot is available, the request checks the backlog capacity
  3. Backlog Queue:
    • A counter tracks the number of requests waiting for a slot
    • If backlog capacity is reached, new requests are rejected immediately with 503 Service Unavailable
    • Requests in the backlog wait with a timeout for a slot to become available
  4. Timeout Handling:
    • Waiting requests use time.NewTimer with the configured Timeout
    • Three exit conditions: slot acquired, timeout reached, or request context cancelled
    • On timeout or cancellation, the backlog counter is decremented
  5. Thread Safety: A sync.Mutex protects the backlog counter to prevent race conditions.

Default Values

  • Limit: 100 concurrent requests
  • Backlog: 1000 waiting requests
  • Timeout: 30 seconds

Error Responses

  • 503 Service Unavailable with “service busy” - backlog capacity exceeded
  • 503 Service Unavailable with “request timeout” - timeout waiting for slot

Throttle vs Rate Limit

Best Practices

  • Use for upstream service protection
  • Set reasonable wait timeouts
  • Monitor queue depths
  • Combine with rate limiting for full control
  • Set BacklogSet: true when using Backlog: 0 to disable queueing
  • Use OnThrottle callback for monitoring and metrics collection

Testing