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.