Fundamentos Rendimiento WebSocket
WebSockets proporcionan canales comunicación full-duplex sobre una sola conexión TCP, habilitando intercambio datos en tiempo real.
Métricas Clave Rendimiento
- Tiempo Conexión - Tiempo establecer conexión WebSocket
- Latencia Mensajes - Tiempo ida y vuelta mensajes
- Throughput - Mensajes por segundo (MPS)
- Conexiones Concurrentes - Conexiones simultáneas máximas
- Tasa Pérdida Mensajes - Porcentaje mensajes perdidos
Testing Conexiones WebSocket
Artillery WebSocket Load Testing
# websocket-test.yml
config:
target: "ws://localhost:3000"
phases:
- duration: 60
arrivalRate: 10
- duration: 300
arrivalRate: 50
scenarios:
- name: "Chat application"
engine: "socketio"
flow:
- emit:
channel: "join"
data:
room: "general"
- loop:
- emit:
channel: "message"
count: 100
artillery run websocket-test.yml
K6 WebSocket Testing
import ws from 'k6/ws';
import { check } from 'k6';
export let options = {
stages: [
{ duration: '30s', target: 100 },
{ duration: '2m', target: 500 },
{ duration: '30s', target: 0 },
],
};
export default function () {
const url = 'ws://localhost:3000/socket';
const res = ws.connect(url, function (socket) {
socket.on('open', () => {
socket.setInterval(() => {
socket.send(JSON.stringify({ type: 'ping', timestamp: Date.now() }));
}, 1000);
});
socket.on('message', (data) => {
const response = JSON.parse(data);
const latency = Date.now() - response.timestamp;
});
});
check(res, { 'status is 101': (r) => r && r.status === 101 });
}
Escalado WebSocket
Balanceo Carga Nginx
upstream websocket_backend {
least_conn;
server localhost:3000;
server localhost:3001;
}
server {
listen 80;
location /socket {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Monitoreo Rendimiento
const promClient = require('prom-client');
const activeConnections = new promClient.Gauge({
name: 'websocket_active_connections' (como se discute en [Gatling: High-Performance Load Testing with Scala DSL](/blog/gatling-performance-testing)),
help: 'Conexiones WebSocket activas'
});
wss.on('connection', (ws) => {
activeConnections.inc();
ws.on('close', () => activeConnections.dec());
});
Conclusión
Testing rendimiento WebSocket requiere enfoques especializados para comunicación tiempo real. Usar herramientas apropiadas, implementar monitoreo correcto y seguir mejores prácticas asegura que aplicaciones WebSocket (como se discute en Burp Suite for QA Engineers: Complete Security Testing Guide) rindan confiablemente bajo carga.