Hoai-Nho-Logo

/

Blog

AboutProjectsBlogContact

All topics

All topics
Explore the newest trends in technology. Learn about AI, software, gadgets, and cybersecurity. Stay up to date in the fast-paced world of tech.
AI
image-render-seo

The Ultimate Guide to Image Rendering in ReactJS: Performance, SEO, and Best Practices (2025)

Overview: The Critical Role of Images in Modern Web Development Images are fundamental to web experiences, accounting for approximately 50% of a typical webpage’s total size. How you choose to render these assets significantly impacts user experience, page performance, and search engine rankings. As web technologies evolve, developers have multiple options for implementing images in […]

Architecture & Design

Architecture & Design
Discover cutting-edge architecture and design ideas. Explore innovative projects, modern interior design trends, sustainable architecture, and creative design solutions to inspire your next project.aws saa-c03
AWS

Explore best practices, tutorials, case studies, and insights on leveraging AWS’s vast ecosystem to build, deploy, and manage applications in the cloud

Design patterns

The Design Pattern category explores reusable solutions to common software design challenges, helping developers write efficient, maintainable, and scalable code

Docker
Explore essential Docker tutorials and resources. Find helpful tips, best practices, and tools to master containerization and improve your deployment workflow.
Security

The Security category focuses on best practices, tools, and frameworks essential for protecting applications, data, and infrastructure in an increasingly digital world

SSL license expired?

Ultimate Guide to Renewing SSL Certificates: Secure Your Website in 2024

Ensure your website stays secure! 🔒 Learn how to check, renew, and manage your SSL certificate to prevent security risks and downtime. Follow our step-by-step guide with best practices to keep your HTTPS protection active in 2024!

CSS

Database

Database
Find easy-to-follow guides on database SQL, NoSQL, PostgreSQL, and MySQL. Learn how to make databases that are fast and work well. Get tips to improve your skills. database
MySQL
Discover essential database guides covering SQL, NoSQL, and best practices. Get tips and performance benchmarks to improve your data management skills.
NoSQL
Discover essential database guides covering SQL, NoSQL, and best practices. Get tips and performance benchmarks to improve your data management skills.
PostgreSQL
Explore comprehensive PostgreSQL tutorials and resources. Find helpful tips, best practices, and performance benchmarks to enhance your database skills.
Search topic

LIKE vs Full-Text Search: SQL Performance and Use Cases

Explore the differences between SQL’s LIKE operator and Full-Text Search. Learn their syntax, performance, use cases, and advanced features for optimizing database queries

Generation

Interview Question

NodeJS

NodeJS
Explore beginner to advanced tutorials on JavaScript and TypeScript. Find helpful tips, best practices, and tools to create powerful web applications. typescript_vs_javascript
Javascript/Typescript
Learn JavaScript and TypeScript with easy guides. Discover tips, best practices, and tools to build efficient web applications quickly.
image-render-seo

The Ultimate Guide to Image Rendering in ReactJS: Performance, SEO, and Best Practices (2025)

Overview: The Critical Role of Images in Modern Web Development Images are fundamental to web experiences, accounting for approximately 50% of a typical webpage’s total size. How you choose to render these assets significantly impacts user experience, page performance, and search engine rankings. As web technologies evolve, developers have multiple options for implementing images in […]


© 2025 Hoai-Nho. All rights reserved.

ContactGitHub
  1. Home
  2. /Blog
  3. /How to Handle WebSocket Load Balancing Without Losing the Connection Thread

How to Handle WebSocket Load Balancing Without Losing the Connection Thread

1. Sticky Sessions in the Load Balancer Example: NGINX Sticky Sessions Strength Weaknesses: Advantages: Disadvantages: Use Cases: Mechanism: Potential Issues: 2. Session Sharing via Redis Example: Socket.IO with Redis Strengths: Weaknesses: Advantages: Disadvantages: Use Cases: Mechanism: Potential Issues: 3. Sticky Sessions Based on IP Address (IP Hash) Example: HAProxy IP Hash for WebSockets Strengths: Weaknesses: […]

6 ways load balancing with websocket
Hoài Nhớ@hoainho
November 09, 2024
|

9 min read

|

830 Views

Share:

1. Sticky Sessions in the Load Balancer

Example: NGINX Sticky Sessions
http {
    upstream websocket_backend {
        ip_hash;  # Ensures clients from the same IP go to the same backend
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://websocket_backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}
Strength
  • Simplicity: Sticky sessions using IP hash or cookies are simple to configure, especially with NGINX or HAProxy.
  • Out-of-the-box solution: Many load balancers support sticky sessions by default, which reduces the need for custom logic.
  • Low latency: Once the session is sticky, the connection remains with the same server, reducing round-trip times and overhead.
Weaknesses:
  • IP Hash Limitations: Using IP hash may be unreliable in cases where clients are behind proxies, use VPNs, or have dynamic IP addresses.
  • Scaling: As you add more backend servers, you may encounter situations where certain servers handle significantly more connections than others due to the hashing mechanism.
Advantages:
  • Easy Setup: This is often the simplest approach to achieve session persistence without introducing additional complexities.
  • Load Balancer Support: Many load balancers have built-in support for sticky sessions, making it easier to configure in production.
Disadvantages:
  • Single Point of Failure: If the backend server goes down, the session might be lost unless you have a failover mechanism.
  • Less Flexible: Doesn’t address scenarios like scaling based on load balancing criteria other than IP (like performance, health, etc.).
DIsadvantages
Use Cases:
  • Small to Medium Applications: Applications with a limited number of users or stable client IP addresses can benefit from this solution.
  • Simple Applications: If the app doesn’t need complex session management across multiple backends.
Mechanism:
  • Sticky sessions are typically implemented using either cookies (storing a session ID) or by hashing the client IP address to always direct the user to the same server.
Mechanism
Potential Issues:
  • Proxy Issues: Clients behind proxies may have their IP addresses obscured, leading to problems with sticky session routing.
  • Server Overload: If the sticky mechanism fails to balance traffic properly, some backend servers may become overloaded while others are under-utilized.
Potential Issues

2. Session Sharing via Redis

Example: Socket.IO with Redis
const socketIo = require("socket.io");
const redisAdapter = require("socket.io-redis");
const redis = require("redis");

const io = socketIo(server);

// Configure Redis as an adapter to share sessions
io.adapter(redisAdapter({ host: 'localhost', port: 6379 }));

// Handle connection
io.on("connection", (socket) => {
  console.log("User connected: " + socket.id);
});
Strengths:
  • Centralized Session Storage: Redis can hold session data that is shared between all backend instances, enabling seamless session continuity even if the client reconnects to a different server.
  • Scalable: Redis is highly scalable and can be used to synchronize WebSocket events across multiple servers without worrying about session loss.
Strengths
Weaknesses:
  • Complexity: Requires setting up Redis and maintaining a Redis server, which adds complexity.
  • Network Latency: Fetching data from Redis on every request introduces network latency, though Redis is fast.
Advantages:
  • High Availability: Redis provides high availability and fault tolerance through clustering.
  • Flexibility: Redis allows you to store more complex session data, including user information, preferences, and other custom session data, that can be shared across servers.
Disadvantages:
  • Resource-Intensive: Redis can consume significant resources as your WebSocket sessions grow, especially if large amounts of data need to be stored and accessed frequently.
  • Management Overhead: You need to ensure Redis is properly configured and maintained, adding operational complexity.
Disadvantages
Use Cases:
  • Large-Scale Applications: For applications with multiple WebSocket server instances and a need to maintain state across sessions.
  • Chat Applications, Multiplayer Games, or Real-Time Dashboards: Where sessions need to persist and be available across different backend servers.
Mechanism:
  • Redis acts as a publish/subscribe mechanism to propagate messages between different WebSocket server instances. The data stored in Redis (e.g., user sessions) is shared across all servers, ensuring consistency.
2 mechanism
Potential Issues:
  • Data Consistency: While Redis ensures availability, you must manage potential consistency issues in highly concurrent environments (e.g., race conditions).
  • Redis Failover: If Redis goes down, it can impact the WebSocket connections and session data. However, Redis clustering and replication can mitigate this risk.

3. Sticky Sessions Based on IP Address (IP Hash)

Example: HAProxy IP Hash for WebSockets
frontend http_front
    bind *:80
    use_backend websocket_backend if { hdr(Upgrade) -i WebSocket }
    default_backend default_backend

backend websocket_backend
    balance source  # This is IP Hash-based routing
    server backend1 192.168.1.1:3000 check
    server backend2 192.168.1.2:3000 check
Strengths:
  • Simple to Implement: Very easy to implement at the load balancer level.
  • Efficient: Routes connections based on client IP, ensuring consistent routing to the same backend.
Weaknesses:
  • Limited Flexibility: Ties the session persistence to the client’s IP address, which isn’t ideal for mobile devices or clients behind proxies.
  • Potential Unfair Load Distribution: Clients from the same IP address might get routed to the same backend, leading to uneven load distribution if certain IPs generate a lot of traffic.
Weaknesses
Advantages:
  • Low Overhead: Doesn’t require additional session management systems like Redis.
  • No External Dependencies: Just relies on the load balancer’s configuration.
Disadvantages:
  • Proxy Issues: If clients are behind a proxy, all traffic may appear to come from the same IP, affecting the load balancing and session persistence.
  • Less Granular Control: Only provides session persistence based on IP, not user-specific criteria or session tokens.
Disadvantages
Use Cases:
  • Simple Applications: Small applications with relatively static client IPs or environments where the proxy issue isn’t a concern.
  • Applications Without Heavy Scaling Needs: If the backend server pool is small and load balancing can be handled simply.
Mechanism:
  • IP Hash is a mechanism where the client’s IP address is hashed and mapped to a backend server, ensuring that all requests from the same IP address are routed to the same server.
Mechanism
Potential Issues:
  • Proxy/Network Address Translation (NAT): Clients behind proxies or NATs may get incorrect routing since multiple clients may share the same public IP.
  • Scaling Issues: If too many clients from the same IP generate traffic, some backend servers might become overloaded while others remain idle.
3 Potential issues

4. WebSocket with Cookies or Session IDs

Example: WebSocket with Session ID in Cookie
// Example client-side WebSocket connection with session cookie
const socket = new WebSocket('ws://example.com', {
  headers: {
    'Cookie': document.cookie // Send session ID via cookie
  }
});

// On server-side, authenticate based on the session ID
io.on("connection", (socket) => {
  const sessionId = socket.request.headers.cookie.split('=')[1]; // Extract session ID
  // Use sessionId to load user data
});
Strengths
  • Customizable Session Management: Session IDs or tokens in cookies provide flexibility, allowing for granular control over session handling.
  • Persistent Session: Session IDs stored in cookies can help maintain continuity when reconnecting, even if the WebSocket server changes, ensuring smoother user experiences.
Advantages
  • Ease of Client Authentication: This approach simplifies client-side authentication, as session IDs in cookies can handle authentication without requiring additional tokens to be managed on the client side.
  • Transparency for Clients: Clients don’t need to manage WebSocket-specific authentication processes manually; the session management is streamlined, with cookies automating much of the connection handling.
Weaknesses
  • Security Challenges: Cookies are vulnerable to attacks like CSRF, XSS, and session hijacking if not properly secured. Using attributes like HttpOnly, Secure, and SameSite is essential for securing cookies.
  • Scalability: If session data is stored centrally (e.g., Redis or a database), scaling to multiple WebSocket servers can add complexity and introduce potential bottlenecks.
4. Weakness
Disadvantages
  • Dependency on Session Expiry: If the session expires, the WebSocket connection may be disconnected, requiring the client to reconnect and possibly re-authenticate.
  • Increased Complexity for Scaling: When session data relies on a central store, it can create performance issues, especially if managed in relational databases, which are less efficient under high WebSocket load.
Use Cases
  • Auth-Based WebSocket Connections: Useful for real-time applications like chat systems or dashboards where connections must be tied to authenticated user sessions.
  • Applications with User-Specific Sessions: Ideal for platforms supporting multitenancy, where each WebSocket session represents an authenticated user.
Mechanism
  1. Session ID Transmission: The client sends a session ID (usually stored in a cookie) when establishing the WebSocket connection.
  2. Validation: The server checks the session ID against a session store (like Redis or a database) to verify the user’s identity and validity of the session.
  3. Connection Routing: Once authenticated, the WebSocket connection can be routed based on the session, allowing for continuity across reconnections.
4. mechanism
Potential Issues
  • Cookie Expiry: Cookies may expire, potentially disrupting WebSocket connections and requiring re-authentication.
  • Centralized Session Store Bottleneck: Relying on a centralized session store can lead to performance issues under heavy traffic, particularly when stored in less scalable databases.
potential issues of 5

5. WebSocket + Distributed Message Queues (e.g., Kafka, RabbitMQ)

Example: Socket.IO with Kafka for Real-Time Message Delivery
// Kafka setup (Producer)
const kafka = require('kafkajs');
const producer = kafka.producer();

await producer.connect();
await producer.send({
  topic: 'websocket-messages',
  messages: [
    { value: 'Message to WebSocket clients' }
  ]
});
Strengths:
  • Fault Tolerance: Distributed message queues like Kafka provide fault tolerance and can handle high volumes of messages.
  • Decoupling: With Kafka or RabbitMQ, your WebSocket servers are decoupled from the messaging infrastructure, allowing more flexibility and scalability in how messages are sent to WebSocket clients.
  • Real-Time Updates: These systems excel at distributing real-time events to multiple consumers (WebSocket servers) in a scalable manner.
5. strengths
Weaknesses:
  • Complexity: Requires setting up and managing a distributed message queue (like Kafka or RabbitMQ), which adds overhead in terms of infrastructure and configuration.
  • Latency: While message queues are fast, they still introduce some latency between event generation and message delivery, which can affect real-time performance in some high-speed scenarios.
Advantages:
  • Scalability: Kafka, RabbitMQ, and similar systems can scale horizontally to handle massive loads. This allows multiple WebSocket servers to consume messages from the same queue, facilitating scalability across many WebSocket instances.
  • Durability: Messages in queues like Kafka are stored in a durable way, ensuring that messages are not lost even if a WebSocket server or other component fails.
Disadvantages:
  • Increased Infrastructure Complexity: Running a distributed system like Kafka requires careful setup, monitoring, and maintenance. This can introduce additional complexity into your architecture.
  • Eventual Consistency: With distributed systems, you may encounter situations where message delivery is slightly delayed, or clients may experience slight inconsistencies due to network failures or partitioning.
Disadvantages
Use Cases:
  • Large-Scale Real-Time Applications: Applications like live sports tracking, collaborative editing tools, and multiplayer games where multiple WebSocket servers need to send messages to clients reliably and in real-time.
  • Event-Driven Architectures: Applications where events are processed asynchronously and later delivered to clients in real-time.
Mechanism:
  • When an event occurs (e.g., a user sends a message in a chat), the WebSocket server produces the message to a message queue like Kafka.
  • Multiple WebSocket servers (which act as consumers) are subscribed to the queue and will consume the event data to broadcast it to the connected clients. This ensures that messages are propagated to all users regardless of which WebSocket server they are connected to.
Potential Issues:
  • Message Ordering: Depending on how the message queue is configured, there could be issues with message ordering, which may affect real-time applications where sequence matters.
  • Backpressure: If the consumers (WebSocket servers) cannot keep up with the rate of message production, backpressure could occur, leading to message delays or dropped connections.

6. WebSocket + Service Mesh (e.g., Istio)

Example: Istio Gateway Configuration for WebSocket
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: websocket-service
spec:
  hosts:
    - "websocket.example.com"
  http:
    - match:
        - uri:
            exact: "/ws"
      route:
        - destination:
            host: websocket-service
            port:
              number: 80
      websocketUpgrade: true  # Enable WebSocket support
Strengths:
  • Centralized Control: With a service mesh like Istio, you can control and manage all the WebSocket connections at the infrastructure level without modifying your application code.
  • Advanced Routing and Load Balancing: Service meshes provide advanced routing strategies, retries, timeouts, and circuit breaking that are essential for resilient, production-ready WebSocket communication.
  • Security and Observability: Istio offers built-in features for encryption, traffic monitoring, and tracing for WebSocket connections, giving developers visibility into the health of WebSocket connections and traffic flows.
Weaknesses:
  • Learning Curve: Setting up and configuring a service mesh can be complex, requiring expertise in Kubernetes, Istio, and service mesh architecture.
  • Overhead: Running a service mesh introduces additional network and computational overhead, which may not be ideal for simple applications.
Advantages:
  • Resiliency: Automatic retries, circuit breakers, and fault injection capabilities ensure that WebSocket connections are resilient and can handle transient failures gracefully.
  • Fine-Grained Control: You have control over how traffic is routed, how many retries are attempted, and whether new WebSocket connections can be routed to healthy backends only.
  • Security: End-to-end encryption and identity-based access control can be enforced using the service mesh.
6-advantages
Disadvantages:
  • Operational Complexity: The complexity of managing Istio or another service mesh in production can be high, especially for smaller teams or organizations without Kubernetes expertise.
  • Resource Consumption: Service meshes introduce a level of resource overhead, as each proxy and sidecar will consume additional CPU, memory, and network resources.
Use Cases:
  • Microservices with WebSockets: When running WebSocket services in a microservices environment (especially with Kubernetes), a service mesh can provide traffic management, security, and observability across multiple WebSocket endpoints.
  • Highly Resilient Systems: For environments where uptime is critical, and you need advanced routing, fault tolerance, and real-time metrics.
Mechanism:
  • The service mesh (e.g., Istio) intercepts WebSocket traffic between clients and services, providing advanced routing, load balancing, retries, and traffic policies for WebSocket connections.
  • Istio can help route WebSocket traffic based on service health, manage load balancing, and apply fine-grained traffic control rules.
6-mechnism
Potential Issues:
  • Overhead: The additional proxy and service mesh components introduce resource overhead and complexity.
  • Troubleshooting: Debugging issues in a service mesh environment can be complex, especially when network policies or configurations cause unexpected behaviors.

Conclusion

Each approach for handling sticky sessions and WebSocket traffic comes with its unique advantages and challenges, making it important to choose the right solution based on your application’s specific needs. Here’s a recap of key considerations:

  • Sticky Sessions: Simple, but can face issues with scaling and dynamic IPs. Best for smaller setups.
  • Redis-based Session Sharing: Scalable and flexible, but adds complexity and potential latency due to network calls to Redis.
  • Message Queues (Kafka/RabbitMQ): Ideal for distributed systems with high scalability needs, but introduces potential for message ordering and backpressure issues.
  • Service Mesh (Istio): Provides robust routing, resiliency, and security, but adds significant operational overhead and complexity
Conclusion

Tags:
Load BalancingRealtime ApplicationSocketIOWebsocket
Written by

author
Hoài Nhớ

Hoài Nhớ

@Hoài Nhớ
Load BalancingRealtime ApplicationSocketIOWebsocket

Table of Contents

    References posts

    The Ultimate Guide to Image Rendering in ReactJS: Performance, SEO, and Best Practices (2025)

    Overview: The Critical Role of Images in Modern Web Development Images are fundamental to web experiences, accounting for approximately 50% of a typical webpage’s total size. How you choose to render these assets significantly impacts user experience, page performance, and search engine rankings. As web technologies evolve, developers have multiple options for implementing images in […]

    Hoài Nhớ
    React Coin Celebration Animation Component | Interactive Particle Effects

    A high-performance React component that creates an engaging coin celebration animation using Framer Motion. Features dynamic particle systems, smooth transitions, and interactive effects perfect for gaming applications, reward celebrations, and interactive web experiences. Built with React 18+ and Framer Motion.

    Hoài Nhớ
    Boosting Backend Performance with Distributed Cache: A Comprehensive Guide

    Learn how distributed caching with Redis can boost backend performance and scalability. This guide covers setup, caching strategies, and a step-by-step technical demo with benchmarks.

    Hoài Nhớ
    Related Posts

    image-render-seo
    SEO
    The Ultimate Guide to Image Rendering in ReactJS: Performance, SEO, and Best Practices (2025)

    Overview: The Critical Role of Images in Modern Web Development Images are fundamental to web experiences, accounting for approximately 50% of a typical webpage’s total size. How you choose to render these assets significantly impacts user experience, page performance, and search engine rankings. As web technologies evolve, developers have multiple options for implementing images in […]

    Hoài Nhớ
    coin-celebration-effect
    AnimationCoin Celebration
    React Coin Celebration Animation Component | Interactive Particle Effects

    A high-performance React component that creates an engaging coin celebration animation using Framer Motion. Features dynamic particle systems, smooth transitions, and interactive effects perfect for gaming applications, reward celebrations, and interactive web experiences. Built with React 18+ and Framer Motion.

    Hoài Nhớ
    distributed-caching
    Backend PerformanceCaching Strategies
    Boosting Backend Performance with Distributed Cache: A Comprehensive Guide

    Learn how distributed caching with Redis can boost backend performance and scalability. This guide covers setup, caching strategies, and a step-by-step technical demo with benchmarks.

    Hoài Nhớ
    SA interview question
    AWSPopular
    Top 10 questions for solution architect

    Prepare for your Senior Solution Architect interview with these 10 essential questions covering key AWS concepts, microservices architecture, scalability, and system design. Master the critical topics every senior architect should know, from cloud infrastructure to real-time communication solutions. This guide is perfect for those aiming to ace their interview and land a high-paying role in the tech industry.

    Hoài Nhớ
    Load balanced websocket
    PopularSeamless Connections
    Mastering WebSocket Load Balancing: Unlocking the Power of Sticky IPs and Session ID Routing for Seamless Connections

    Introduction In high-demand real-time applications like ride-hailing or booking platforms, maintaining a stable connection between the client and server is crucial. Load balancing for WebSocket connections presents unique challenges, especially in routing the client to the same backend instance consistently. Here, we’ll explore two effective solutions: IP-based sticky sessions and WebSocket routing via session identifiers, […]

    Hoài Nhớ
    High Traffic SolutionsRealtime Application
    Mastering Real-Time Scalability: Redis Solutions for Session Management and Load Balancing in High-Traffic Apps

    Building a Load-Balanced Uber-like Application with Redis When building an application with similar requirements to Uber, seamless session management and real-time updates are essential. Redis can significantly enhance scalability and performance, handling both HTTP session persistence and WebSocket connections across multiple servers. Solution 1: Session Management via Redis (Redis as a Session Store) This approach […]

    Hoài Nhớ

    Subscribe to our newsletter

    Get the latest posts delivered right to your inbox