đ Architecture WebSockets
Implémentation Full-Duplex asynchrone avec Django Channels & Redis.
Introduction WS
Introduction : GenÚse et Rupture Technologique du Temps Réel.
Le Protocole WS
Différences avec HTTP, cycle de vie du Handshake et état de persistance TCP.
Installation & Stack
Configuration de l'environnement virtuel, Channels, Daphne et le serveur Redis.
Routing & Config
Définition de l'application ASGI, protocol_type_router et intégration settings.py.
Consumers (Backend)
Logique asynchrone : Connect, Receive, Disconnect et Broadcasting.
Frontend (Javascript)
Gestion de la connexion native, reconnexion automatique et parsing JSON.
Déploiement Pro
Nginx en Reverse Proxy, SSL (WSS), Superviseur et Sticky Sessions.
L'héritage HTTP/1.1 : Le mur du Stateless
Le web a été conçu sur le modÚle Request-Response. Dans ce monde, le serveur est "sourd" et "amnésique" : il ne peut pas initier de contact avec le client. Pour simuler du temps réel, nous utilisions des "hacks" coûteux :
- Short Polling : RequĂȘtes rĂ©pĂ©tĂ©es (ex: toutes les 1s). RĂ©sultat : 90% de requĂȘtes vides et une saturation inutile de la bande passante.
- Long Polling (Comet) : Le serveur suspend la réponse. ProblÚme : Consomme un thread/processus par utilisateur, provoquant l'effondrement des serveurs sous charge.
- SSE (Server-Sent Events) : Unidirectionnel seulement.
Visualisation du Flux Inefficient (HTTP)
Client -> [SYN] -> Server
Client -> [GET + 800 bytes Headers] -> Server
Server -> [200 OK + 20 bytes Data] -> Client
Server -> [FIN/CLOSE] -> Client (Connexion détruite)
-- Répéter 1000 fois par minute --
Verdict : 98% de métadonnées pour 2% de données utiles.
WebSocket (RFC 6455) : L'unification des flux
WebSocket n'est pas une "couche au-dessus" de HTTP, c'est un protocole indépendant qui utilise le port 80/443 pour traverser les firewalls. Il transforme une transaction HTTP éphémÚre en un tunnel TCP permanent.
L'overhead d'un message WebSocket n'est que de 2 Ă 14 octets, contre plusieurs Ko pour HTTP.
- Client envoie
Upgrade: websocket - Serveur génÚre une clé
Sec-WebSocket-Acceptvia SHA-1 - Le socket TCP est "détourné" du flux HTTP classique
| Caractéristique | HTTP / REST | WebSocket |
|---|---|---|
| ModĂšle | Pull (Client demande) | Push/Pull (Bidirectionnel) |
| Ătat (State) | Stateless (IndĂ©pendant) | Stateful (Contexte conservĂ©) |
| Headers | Massifs (Cookies, User-Agent...) | Négligeables (Framing minimal) |
| Latence | ĂlevĂ©e (RTT + Handshake TCP/TLS) | Ultra-basse (Tube dĂ©jĂ ouvert) |
| Scalabilité | Facile (Horizontale/Stateless) | Complexe (Gestion des sessions actives) |
Quand l'utiliser impérativement ?
- Collaboratif : Curseurs en temps réel, édition simultanée.
- Finance : Flux de prix (OrderBooks) oĂč 50ms font la diffĂ©rence.
- Monitoring : Dashboards Ops / Logs serveurs en streaming.
Les contraintes de l'indispensable
Le passage au WebSocket impose une réarchitecture complÚte du backend :
- Fin du synchrone (nécessite l'Asynchrone/Event Loop).
- Gestion des "Zombie Connections" et des Timeouts.
- Besoin d'un Message Broker (Redis) pour synchroniser plusieurs serveurs.
đŻ Conclusion : WebSocket est l'outil ultime pour passer d'un web de "consultation" Ă un web "interactif vivant".
Le paradigme "Event-Driven"
Contrairement au HTTP (Request/Response), le WebSocket est un tube ouvert :
- Persistance : Pas besoin de renvoyer les headers HTTP Ă chaque message.
- Low Latency : Idéal pour le trading, le chat ou le gaming.
- Full Duplex : Le serveur peut "pousser" (push) une info sans demande du client.
Pourquoi Channels ?
Django est nativement synchrone. Channels permet d'encapsuler Django dans une couche asynchrone (ASGI) qui gĂšre les connexions longues pendant que Django continue de traiter ses vues classiques.
Installez les composants essentiels pour un environnement asynchrone performant.
Redis sert de "HUB". Sans lui, un utilisateur sur le Worker A ne peut pas parler Ă un utilisateur sur le Worker B.
Voici l'implémentation d'un Consumer qui gÚre des groupes (Rooms) de maniÚre robuste.
Script Client Natif
Sécurité Origin
Par défaut, Django Channels vérifie l'Origin. Si vous utilisez un domaine différent, configurez AllowedHostsOriginValidator.
