📊 Capítulo 17: WebSockets & Tempo Real
Especialização Backend com Python & FastAPI
🗺️ O Handshake e o Canal Bidirecional do WebSocket
sequenceDiagram
autonumber
actor C as Cliente Web / App
participant S as FastAPI WebSocket Server
participant M as ConnectionManager (Pool de Conexões)
C->>S: HTTP GET /ws/chat (Header Upgrade: websocket)
S->>S: Valida Token JWT no handshake
S->>M: manager.connect(websocket, room_id)
S-->>C: HTTP 101 Switching Protocols (Canal Aberto!)
Note over C,S: Comunicação Full-Duplex de Baixíssima Latência
C->>S: Envia Mensagem de Chat (JSON)
S->>M: manager.broadcast(mensagem, room_id)
M-->>C: Notifica todos os clientes conectados na sala instantaneamente ⚡
🎯 Slide 1: Endpoints @app.websocket no FastAPI
from fastapi import WebSocket, WebSocketDisconnect
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: int):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.broadcast(f"Cliente #{client_id} diz: {data}")
except WebSocketDisconnect:
manager.disconnect(websocket)
await manager.broadcast(f"Cliente #{client_id} desconectou")
🎯 Slide 2: Gerenciador de Conexões (ConnectionManager)
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
🎯 Slide 3: Escalabilidade Horizontal com Redis Pub/Sub
- Múltiplas Instâncias de Servidor: Se o usuário A estiver conectado na Instância 1 e o usuário B na Instância 2, use o Redis Pub/Sub para sincronizar mensagens entre todos os nós do cluster!
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim