🔧 AI Nachrichten Major AI platforms go down in unprecedented simultaneous outage(03.09.2026 um 17:34 Uhr)
🔧 AI Nachrichten ChatGPT, Claude, and Grok Down? Users Report Widespread Outages(03.09.2026 um 19:14 Uhr)
🔧 AI Nachrichten OpenAI Launches GPT-6 Astra, Says We May Have Entered the AGI Era(03.09.2026 um 22:08 Uhr)
🔧 AI Nachrichten Claude Comes to CarPlay as Fifth Major AI Chatbot App(05.09.2026 um 05:31 Uhr)
🔧 AI Nachrichten OpenAI’s GPT-6 Astra Is AGI, Says NVIDIA CEO Jensen Huang(07.09.2026 um 06:31 Uhr)
🔧 AI Nachrichten Blame AI companies for Mac mini and Mac Studio shortage(31.08.2026 um 10:32 Uhr)
🔧 AI Nachrichten Major AI platforms go down in unprecedented simultaneous outage(03.09.2026 um 17:34 Uhr)
🔧 AI Nachrichten ChatGPT, Claude, and Grok Down? Users Report Widespread Outages(03.09.2026 um 19:14 Uhr)
🔧 AI Nachrichten OpenAI Launches GPT-6 Astra, Says We May Have Entered the AGI Era(03.09.2026 um 22:08 Uhr)
🔧 AI Nachrichten Claude Comes to CarPlay as Fifth Major AI Chatbot App(05.09.2026 um 05:31 Uhr)
🔧 AI Nachrichten OpenAI’s GPT-6 Astra Is AGI, Says NVIDIA CEO Jensen Huang(07.09.2026 um 06:31 Uhr)
🔧 AI Nachrichten Blame AI companies for Mac mini and Mac Studio shortage(31.08.2026 um 10:32 Uhr)

🔧 Programmierung 🕛 kürzlich 10 Min Lesezeit
0

Building Resilient Real-Time Systems: A Deep Dive into WebSockets and Redis

↗ Quelle (dev.to)
🗣️ Stimme:
📑 Inhaltsübersicht

Originally published on tamiz.pro.



Real-time systems are no longer a luxury but a fundamental expectation in modern web applications, from collaborative editing to live dashboards and instant messaging. Achieving true real-time functionality, however, comes with significant engineering challenges, particularly around resilience, scalability, and state management. This article deep dives into how WebSockets and Redis, when used together, form a powerful duo for constructing highly resilient and performant real-time architectures.






The Core Challenge: State and Connectivity in Real-Time



Traditional HTTP is stateless and request-response based, making it ill-suited for continuous, low-latency, bi-directional communication. This is where WebSockets shine, providing persistent, full-duplex communication channels between client and server. However, WebSockets alone don't solve the problems of horizontal scaling, fault tolerance, or managing application state across multiple connected clients or server instances. This is where a robust data store and message broker become crucial.






WebSockets: The Persistent Connection Layer



WebSockets establish a long-lived connection, allowing both the server and client to push data to each other at any time, without the overhead of HTTP headers on every message. This dramatically reduces latency and network traffic.






How WebSockets Work (Simplified)




  1. Handshake: A client initiates a standard HTTP request to a WebSocket URL (e.g., ws://example.com/socket).

  2. Upgrade: The server responds with an Upgrade header, switching the protocol from HTTP to WebSocket.

  3. Persistent Connection: Once upgraded, the TCP connection remains open, and a WebSocket frame-based protocol is used for data exchange.



This persistent nature is excellent for individual client-server interactions but introduces complexities when scaling out. If a server handling a WebSocket connection goes down, that connection is lost. If clients need to receive messages from other clients or backend services, a single WebSocket server becomes a bottleneck.






Redis: The Backbone for Resilience and Scalability



Redis is an open-source, in-memory data structure store, used as a database, cache, and message broker. Its speed and versatility make it an ideal companion for real-time systems.






Key Redis Features for Real-Time Systems:




  • Pub/Sub (Publish/Subscribe): This is perhaps the most critical feature. Redis Pub/Sub allows a message to be published to a channel and instantly received by all subscribers to that channel. This decouples message producers from consumers, enabling horizontal scaling of WebSocket servers.

  • Atomic Operations and Data Structures: Redis supports various atomic operations on data types like strings, lists, sets, hashes, and sorted sets. These are invaluable for managing real-time state (e.g., presence detection, leaderboards, chat histories).

  • Persistence: While primarily in-memory, Redis supports RDB snapshots and AOF (Append Only File) for data persistence, ensuring data isn't lost on server restarts.

  • High Availability (Redis Sentinel & Cluster): Redis Sentinel provides high availability for Redis instances by monitoring, notifying, and automatically failing over if a master instance goes down. Redis Cluster shards data across multiple nodes, offering even greater scalability and resilience.






Architectural Patterns for Resilience with WebSockets and Redis



Combining these technologies enables several robust architectural patterns.






1. Decoupling WebSocket Servers with Pub/Sub



This is the cornerstone of scaling real-time systems. Instead of each WebSocket server needing to know about all other connected clients, they all subscribe to messages from a central Redis Pub/Sub instance.



Scenario: A chat application where users are connected to different WebSocket servers.




  • When User A (connected to WS Server 1) sends a message, WS Server 1 publishes this message to a Redis channel (e.g., chat:room:general).

  • All other WS Servers (e.g., WS Server 2, WS Server 3) are subscribed to chat:room:general.

  • Upon receiving the message from Redis, each WS Server forwards it to its own connected clients who are in that chat room.



This ensures that messages are broadcast to all relevant clients, regardless of which specific WebSocket server they are connected to. If WS Server 1 goes down, WS Server 2 and WS Server 3 continue to operate, and clients can reconnect to any available server.




CODE
graph TD
Client1[Client A] -->|WebSocket| WSS1[WebSocket Server 1]
Client2[Client B] -->|WebSocket| WSS2[WebSocket Server 2]
Client3[Client C] -->|WebSocket| WSS1

WSS1 -->|PUBLISH chat:room:general| RedisPubSub(Redis Pub/Sub)
WSS2 -->|SUBSCRIBE chat:room:general| RedisPubSub

RedisPubSub -->|Message 'Hello World'| WSS1
RedisPubSub -->|Message 'Hello World'| WSS2

WSS1 -->|Push 'Hello World'| Client3
WSS2 -->|Push 'Hello World'| Client2









2. Managing Presence and State with Redis Data Structures



Redis data structures are excellent for tracking real-time application state.





  • Presence Detection: Use Redis Sets to store user_ids for users currently online in a specific room or application. When a user connects to a WebSocket server, add their ID to the set. On disconnect, remove it. This allows any server to quickly query who is online.


    CODE
    # On WebSocket connection
    redis_client.sadd('online_users:room:general', user_id)

    # On WebSocket disconnection
    redis_client.srem('online_users:room:general', user_id)

    # Get all online users
    online_users = redis_client.smembers('online_users:room:general')




  • Recent History/Missed Messages: Use Redis Lists (acting as capped collections with LTRIM) or Sorted Sets to store recent messages or events. When a client reconnects or joins, they can fetch the last N messages from Redis.


    CODE
    # Store a message
    redis_client.rpush('chat:history:room:general', 'timestamp|user_id|message')
    redis_client.ltrim('chat:history:room:general', -100, -1) # Keep last 100 messages

    # Retrieve history
    history = redis_client.lrange('chat:history:room:general', 0, -1)








3. High Availability with Redis Sentinel and Load Balancing



For true resilience, the Redis instance itself needs to be highly available. Redis Sentinel provides this by managing master-replica configurations and performing automatic failovers.




  • Redis Sentinel: Monitors your Redis master and replica instances. If the master fails, Sentinel automatically promotes a replica to master and reconfigures other replicas.


  • Load Balancing WebSocket Servers: Place a load balancer (e.g., Nginx, HAProxy, AWS ALB) in front of your WebSocket servers. The load balancer distributes incoming WebSocket upgrade requests across available servers. Crucially, sticky sessions (based on client IP or a cookie) are often used to ensure a client remains connected to the same WebSocket server for the duration of their session, though this can complicate scaling and fault tolerance if a server goes down.



    A more robust approach, especially in containerized environments, is to ensure that any WebSocket server can handle any client's connection, relying on Redis Pub/Sub for cross-server communication rather than sticky sessions.






CODE
graph TD
ClientA[Client A] --> LoadBalancer(Load Balancer)
ClientB[Client B] --> LoadBalancer

LoadBalancer --> WSS1[WebSocket Server 1]
LoadBalancer --> WSS2[WebSocket Server 2]
LoadBalancer --> WSS3[WebSocket Server 3]

WSS1 --> RedisSentinel(Redis Sentinel)
WSS2 --> RedisSentinel
WSS3 --> RedisSentinel

subgraph Redis Cluster
RedisSentinel --> RedisMaster[Redis Master]
RedisSentinel --> RedisReplica1[Redis Replica 1]
RedisSentinel --> RedisReplica2[Redis Replica 2]
end

RedisMaster <--> RedisReplica1
RedisMaster <--> RedisReplica2

RedisMaster -->|Pub/Sub & Data| WSS1
RedisMaster -->|Pub/Sub & Data| WSS2
RedisMaster -->|Pub/Sub & Data| WSS3









Implementing a Basic Pub/Sub Example (Python with websockets and redis-py)



Let's illustrate the Pub/Sub pattern with a simple Python example.






Prerequisites




  • Python 3.7+

  • websockets library (pip install websockets)

  • redis-py library (pip install redis)

  • A running Redis instance






1. Redis Publisher Script (publisher.py)



This script simulates a backend service publishing messages to a Redis channel.




CODE
import redis
import time

REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_CHANNEL = 'my_realtime_channel'

def publish_messages():
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=0)
message_id = 0
while True:
message = f"Hello from publisher! Message ID: {message_id}"
print(f"Publishing: {message}")
r.publish(REDIS_CHANNEL, message)
message_id += 1
time.sleep(2) # Publish every 2 seconds

if __name__ == "__main__":
print(f"Starting Redis publisher on channel '{REDIS_CHANNEL}'...")
publish_messages()









2. WebSocket Server Script (websocket_server.py)



This script runs a WebSocket server that subscribes to the Redis channel and forwards messages to connected clients.




CODE
import asyncio
import websockets
import redis
import json

REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_CHANNEL = 'my_realtime_channel'
WS_PORT = 8765

CONNECTED_CLIENTS = set() # To keep track of all connected WebSocket clients

async def register(websocket):
CONNECTED_CLIENTS.add(websocket)
print(f"Client connected: {websocket.remote_address}. Total clients: {len(CONNECTED_CLIENTS)}")

async def unregister(websocket):
CONNECTED_CLIENTS.remove(websocket)
print(f"Client disconnected: {websocket.remote_address}. Total clients: {len(CONNECTED_CLIENTS)}")

async def handle_websocket_connection(websocket, path):
await register(websocket)
try:
async for message in websocket:
# Clients can send messages too, if needed
print(f"Received from client {websocket.remote_address}: {message}")
# For simplicity, we'll just ignore client messages here
pass
except websockets.exceptions.ConnectionClosedOK:
pass
finally:
await unregister(websocket)

async def redis_listener():
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=0)
pubsub = r.pubsub()
pubsub.subscribe(REDIS_CHANNEL)

print(f"Subscribing to Redis channel '{REDIS_CHANNEL}'...")
for message in pubsub.listen():
if message['type'] == 'message':
data = message['data'].decode('utf-8')
print(f"Received from Redis: {data}")
# Broadcast message to all connected WebSocket clients
if CONNECTED_CLIENTS:
await asyncio.gather(*[client.send(data) for client in CONNECTED_CLIENTS])

async def main():
# Start the WebSocket server
websocket_server = websockets.serve(handle_websocket_connection, 'localhost', WS_PORT)
print(f"WebSocket server started on ws://localhost:{WS_PORT}")

# Start the Redis listener
await asyncio.gather(websocket_server, redis_listener())

if __name__ == "__main__":
asyncio.run(main())









3. HTML Client (index.html)



Open this HTML file in your browser to connect to the WebSocket server.




CODE
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Redis Demo</title>
<style>
body { font-family: sans-serif; }
#messages { border: 1px solid #ccc; padding: 10px; min-height: 200px; max-height: 400px; overflow-y: scroll; margin-top: 10px; }
.message { margin-bottom: 5px; padding: 5px; background-color: #f0f0f0; border-radius: 3px; }
.status { color: gray; font-size: 0.9em; }
</style>
</head>
<body>
<h1>WebSocket Redis Real-Time Demo</h1>
<p class="status" id="status">Connecting...</p>
<div id="messages"></div>

<script>
const ws = new WebSocket('ws://localhost:8765');
const messagesDiv = document.getElementById('messages');
const statusDiv = document.getElementById('status');

ws.onopen = () => {
statusDiv.textContent = 'Status: Connected';
statusDiv.style.color = 'green';
console.log('WebSocket connected');
};

ws.onmessage = event => {
const messageElement = document.createElement('div');
messageElement.classList.add('message');
messageElement.textContent = `Received: ${event.data}`;
messagesDiv.appendChild(messageElement);
messagesDiv.scrollTop = messagesDiv.scrollHeight; // Scroll to bottom
console.log('Message from server:', event.data);
};

ws.onclose = () => {
statusDiv.textContent = 'Status: Disconnected';
statusDiv.style.color = 'red';
console.log('WebSocket disconnected');
};

ws.onerror = error => {
statusDiv.textContent = 'Status: Error - Check console';
statusDiv.style.color = 'red';
console.error('WebSocket error:', error);
};
</script>
</body>
</html>









How to Run:




  1. Ensure Redis server is running (e.g., redis-server).

  2. Run the publisher: python publisher.py

  3. Run the WebSocket server: python websocket_server.py

  4. Open index.html in your web browser. You should see messages appearing every 2 seconds.

  5. Open multiple index.html tabs/browsers. All will receive the same messages, demonstrating the broadcast.

  6. Try running another instance of websocket_server.py on a different port (and update index.html to connect to it). Both servers will subscribe to the same Redis channel, showing how you can scale out your WebSocket layer.






Conclusion



Building resilient real-time systems requires careful consideration of connectivity, state management, and scalability. WebSockets provide the efficient, bi-directional communication channel, while Redis, with its Pub/Sub capabilities, versatile data structures, and high-availability features (Sentinel, Cluster), offers the robust backend infrastructure needed to make these systems truly resilient and scalable. By decoupling your WebSocket servers and leveraging Redis for message brokering and shared state, you can build real-time applications that withstand failures and scale to meet growing user demands.

Vollständiger Original-Bericht
Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
↗ Original-Artikel auf dev.to lesen
Wie bewertest du diesen Beitrag?
1 Klick Feedback
Teilen mit Netzwerk & Team:

Community-Analysen & Experten-Meinungen 0

Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum
🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Port 8095 Engine
3 Quellen
GPT-6 Astra Release Today? OpenAI’s Next Major AI Model Is Almost Here
1 Quelle
Apple accuses OpenAI of destroying evidence as trade-secrets fight intensifies
1 Quelle
Major AI platforms go down in unprecedented simultaneous outage
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Building Resilient Real-Time Systems: A Deep Dive into WebSockets and Redis

Thematisch verwandte Begriffe: Building, Resilient, RealTime, Systems · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...