惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog
小众软件
小众软件
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
爱范儿
爱范儿
博客园 - 聂微东
美团技术团队
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
云风的 BLOG
云风的 BLOG
罗磊的独立博客
V
Visual Studio Blog
WordPress大学
WordPress大学
Stack Overflow Blog
Stack Overflow Blog
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
V
V2EX
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

AlgoMaster Newsletter

How Engineers Really Get Promoted to Senior How Load Balancers Actually Distribute Traffic Every Important Design Pattern Explained in 18 Minutes How to Learn Low-Level Design from ZERO in 2026 The AlgoMaster Mobile App Is Here! Kafka vs RabbitMQ vs SQS I Created 1000+ Interactive Animations for Interviews How LLMs are Actually Trained Amazon's Bar Raiser Reveals How to Crack Tech Interviews 20 Networking Concepts Explained in 15 Minutes A deep dive into the Transformer architecture Monolith vs Microservices vs Modular Monoliths Neural Networks Explained In Plain English Top 10 API Gateway Use Cases in System Design How to build an autonomous AI agent like OpenClaw (from scratch) Launching comprehensive resources to master coding interviews Tech Stack I used to build my coding platform (algomaster.io) 300+ Engineering Articles to Level Up Your System Design Skills 20 AI Concepts Explained in 20 Minutes 12 OOP Concepts EVERY Developer Should Know I created a comprehensive resource to master Concurrency Interviews 7 Graph Algorithms You Should Know for Coding Interviews in 2026 Polling vs. Long Polling vs. SSE vs. WebSockets vs. Webhooks How to Scale a System from 0 to 10 million+ Users DSA was HARD until I Learned these 20 Patterns How Git Works Internally The Hidden Cost of Database Indexes I Created the Most Comprehensive System Design Interview Resource How to Use AI Effectively in Large Codebases
How Load Balancers Actually Work
Ashish Pratap Singh · 2026-01-08 · via AlgoMaster Newsletter

A load balancer is one of the most foundational building blocks in distributed systems. It sits between clients and your backend servers and spreads incoming traffic across a pool of machines, so no single server becomes the bottleneck (or the single point of failure).

But the interesting questions start after the definition:

  • How does the load balancer decide which server should handle a request?

  • What’s the difference between L4 and L7 Load Balancers?

  • What happens when a server slows down or goes offline mid-traffic?

  • How can the load balancer ensure that request from the same client always go to the same server?

  • And what happens if the load balancer itself goes down?

In this article, we’ll answer these questions and build an intuitive understanding of how load balancers work in real systems.

Let’s start with the basics: why we need load balancers in the first place.

Imagine a web app with just one server. Every user request hits the same machine.

It works… until it doesn’t. This “single-server” setup has a few fundamental problems:

  1. Single Point of Failure: If the server crashes, your entire application goes down.

  2. Limited Scalability: A single server can only handle so many requests before it becomes overloaded.

  3. Poor Performance: As traffic increases, response times degrade for all users.

  4. No Redundancy: Hardware failures, software bugs, or maintenance windows cause complete outages.

A load balancer solves these problems by distributing traffic across multiple servers.

With this setup, you get:

  • High Availability: If one server fails, traffic is automatically routed to healthy servers.

  • Horizontal Scalability: You can add more servers to handle increased load.

  • Better Performance: Requests are distributed, so no single server is overwhelmed.

  • Zero-Downtime Deployments: You can take servers out of rotation for maintenance without affecting users.

But how does the load balancer decide which server should handle each request?

The load balancer uses algorithms to distribute incoming requests. Each algorithm has different characteristics and is suited for different scenarios.

Below are the most common ones you’ll see in real systems.

The simplest algorithm. Requests are distributed to servers in sequential order.

Request 1 → Server A
Request 2 → Server B
Request 3 → Server C
Request 4 → Server A  (cycle repeats)
Request 5 → Server B
...
  • Simple to implement

  • Works well when all servers have equal capacity

  • Predictable distribution

  • Does not account for server load or capacity differences

  • A slow request on one server does not affect the distribution

Best for: Homogeneous server environments where all servers have similar specs and requests have similar processing times.

An extension of Round Robin where servers are assigned weights based on their capacity.

Server A (weight=3): Handles 3 out of every 6 requests
Server B (weight=2): Handles 2 out of every 6 requests
Server C (weight=1): Handles 1 out of every 6 requests
  • Still simple

  • Better for mixed instance sizes (e.g., 2 vCPU + 4 vCPU + 8 vCPU)

  • Still not load-aware in real time

  • If one server becomes slow (GC pause, noisy neighbor, warm cache vs cold cache), it will still get its scheduled share

Best for: Heterogeneous environments where servers have different capacities (e.g., different CPU, memory, or network bandwidth).

Routes requests to the server with the fewest active connections.

This algorithm is dynamic, it considers the current state of each server rather than using a fixed rotation.

Server A: 10 active connections
Server B: 5 active connections  ← Next request goes here
Server C: 8 active connections
  • Adapts to varying request processing times

  • Naturally balances load when some requests take longer than others

  • Requires tracking connection counts for each server

  • Slightly more overhead than Round Robin

Best for: Applications where request processing times vary significantly (e.g., database queries, file uploads).

Combines Least Connections with server weights. The algorithm considers both the number of active connections and the server’s capacity.

Score = Active Connections / Weight

Server A: 10 connections, weight 5 → Score = 2.0
Server B: 6 connections, weight 2  → Score = 3.0
Server C: 4 connections, weight 1  → Score = 4.0

Next request goes to Server A (lowest score)
  • Works well for mixed instance sizes and mixed request durations

  • More robust than either “weighted” or “least connections” alone

  • Needs reliable tracking + weight tuning

  • Still uses connections as a proxy for load (not always perfect)

Best for: Heterogeneous environments with varying request processing times.

The client’s IP address is hashed to determine which server handles the request. The same client IP always goes to the same server.

hash(192.168.1.10) % 3 = 1 → Server B
hash(192.168.1.20) % 3 = 0 → Server A
hash(192.168.1.30) % 3 = 2 → Server C
  • Simple session persistence without cookies

  • No additional state to track

  • Uneven distribution if IP addresses are not uniformly distributed

  • Server additions/removals cause redistribution of clients

Best for: Applications requiring basic session persistence without cookie support.

Routes requests to the server with the fastest response time and fewest active connections.

The load balancer continuously measures:

  • Average response time for each server

  • Number of active connections

  • Optimizes for perceived performance

  • Can avoid slow/unhealthy servers before they fully fail

  • Highest operational complexity (needs continuous measurement and smoothing)

  • Can “overreact” to noise without careful tuning (feedback loops)

  • Requires good metrics and stable observation windows

Best for: Latency-sensitive applications where response time is critical.