sgcWebSockets 2026.5 — Limitador de Tasa, Disyuntor, Claves API, OAuth para MCP y IOCP más rápido

· Versiones

sgcWebSockets 2026.5 es una versión con mucho contenido. Tres nuevos componentes de infraestructura convierten el servidor WebSocket / HTTP en una pasarela de API de nivel de producción: un limitador de tasa con todas las prestaciones, un disyuntor del lado del cliente y un gestor de claves API con soporte completo del ciclo de vida. En el lado del protocolo hay un nuevo cliente de Forex.com construido sobre una implementación genérica de Lightstreamer TLCP 2.5, el servidor MCP incorpora un flujo OAuth 2.1 integrado para poder conectarse directamente a clientes MCP basados en navegador como claude.ai, y los motores de E/S IOCP (Windows) y EPOLL (Linux) ganan seis mejoras de rendimiento medibles. También hay una primitiva poscuántica temprana: sgcKEM_CreateMLKEM768Keys para generación de pares de claves ML-KEM-768.

Este artículo recorre los aspectos más destacados con fragmentos Delphi listos para pegar para los nuevos componentes.

TsgcWSRateLimiter — limitación de tasa de API lista para usar

Coloque un TsgcWSRateLimiter junto a su servidor y tendrá limitación de tasa por cubeta de tokens, ventana deslizante o ventana fija por IP, por clave API, por usuario o por patrón de endpoint, además de cuotas diarias/mensuales y protección contra ráfagas. El componente es seguro para hilos y persiste el estado en disco (de modo que un reinicio del servidor no concede a cada cliente un nuevo cupo).

uses
  sgcWebSocket_Server_RateLimiter;

var
  oRL: TsgcWSRateLimiter;
  oResult: TsgcRateLimitResult;
begin
  oRL := TsgcWSRateLimiter.Create(nil);
  try
    oRL.TokenBucket.Enabled    := True;
    oRL.TokenBucket.Capacity   := 100;     // burst size
    oRL.TokenBucket.RefillRate := 10;      // tokens / interval
    oRL.TokenBucket.RefillIntervalMs := 1000;

    oRL.PerIP.Enabled       := True;
    oRL.PerIP.MaxRequests   := 60;
    oRL.PerIP.WindowSec     := 60;

    // Consume one token for the current request
    oResult := oRL.Consume('ip:' + vClientIP);
    if not oResult.Allowed then
      RespondHTTP(429, 'Retry-After: ' + IntToStr(oResult.RetryAfterSec));
  finally
    oRL.Free;
  end;
end;

El resolvedor de reglas recorre PerEndpoint (con coincidencia por comodín), después PerAPIKey, PerUser y finalmente PerIP. Los eventos OnThrottled, OnQuotaExceeded y OnStateChange le permiten registrar o anular cada decisión.

Demo: Demos\04.WebSocket_Other_Samples\14.RateLimiter — ejecuta un cliente generador de inundación contra un servidor que publica estadísticas en vivo y motivos de rechazo.

TsgcWSCircuitBreaker — aislamiento de fallos del lado del cliente

Cuando una API ascendente (api.openai.com, una pasarela de pagos, un microservicio interno) empieza a fallar o a ir lenta, quedarse colgado en tiempos de espera TCP le cuesta conexiones, hilos y dinero. TsgcWSCircuitBreaker implementa el clásico patrón de tres estados (cerrado / abierto / semiabierto) sobre cualquier subclase de TsgcHTTPAPI_client, con una ventana temporal deslizante, detección de llamadas lentas, respuestas de respaldo opcionales y anulaciones por endpoint.

uses
  sgcWebSocket_CircuitBreaker;

var
  oCB: TsgcWSCircuitBreaker;
begin
  oCB := TsgcWSCircuitBreaker.Create(nil);
  try
    oCB.Thresholds.FailureCount        := 5;
    oCB.Thresholds.FailureRatePercent  := 50;
    oCB.Thresholds.SlowCallDurationMs  := 2000;
    oCB.Thresholds.SlowCallRatePercent := 80;
    oCB.TimeWindow.RollingWindowSec    := 60;
    oCB.Recovery.CooldownSec           := 30;
    oCB.Recovery.HalfOpenTrialCalls    := 3;

    oCB.Fallback.Enabled        := True;
    oCB.Fallback.UseLastSuccess := True;

    if oCB.IsCallAllowed('openai') then
    try
      vResponse := oOpenAI.ChatCompletion(...);
      oCB.RecordSuccess('openai');
    except
      on E: Exception do
      begin
        oCB.RecordFailure('openai', E.ClassName);
        raise;
      end;
    end
    else
      vResponse := 'service temporarily unavailable';
  finally
    oCB.Free;
  end;
end;

En Delphi 2009+ también está disponible un envoltorio de una sola línea: oCB.Execute('openai', procedure begin oOpenAI.ChatCompletion(...) end); — el registro de éxito / fallo se realiza automáticamente.

Demo: Demos\04.WebSocket_Other_Samples\15.CircuitBreaker.

TsgcWSAPIKeyManager — ciclo de vida de claves en un solo componente

La mayoría de los servidores de "WebSocket API" necesitan claves API: emitir, validar, revocar, rotar. TsgcWSAPIKeyManager envuelve el ciclo de vida completo con autorización basada en ámbitos, hash opcional en reposo, expiración, un registro de auditoría y un período de gracia de rotación integrado para que las claves antiguas sigan funcionando durante una ventana configurable tras la rotación.

uses
  sgcWebSocket_Server_APIKeyManager;

var
  oKM: TsgcWSAPIKeyManager;
  vKey, vNewKey: string;
begin
  oKM := TsgcWSAPIKeyManager.Create(nil);
  try
    oKM.Generation.Length := 40;
    oKM.Generation.Prefix := 'sgc_';
    oKM.Hashing.Enabled   := True;        // store SHA-256 hash, not the plaintext
    oKM.Rotation.GracePeriodSec := 86400; // old key valid for 24h after rotation
    oKM.Expiration.DefaultTTLSec := 30 * 86400;

    // Issue a key for tenant "acme" with read+write scopes, expiring in 7 days
    vKey := oKM.IssueKey('acme', ['read', 'write'], 7 * 86400);

    // Validate the key on each request, optionally requiring a scope
    if not oKM.ValidateKey(vKey, 'read', vClientIP) then
      RespondHTTP(401, 'invalid api key');

    // Rotate a key (returns the new plaintext; old key remains valid for GracePeriodSec)
    oKM.RotateKey(vKey, vNewKey);
  finally
    oKM.Free;
  end;
end;

El componente puede leer la clave directamente desde las cabeceras HTTP entrantes o desde la cadena de consulta con IsRequestAuthorized, de modo que no tiene que cablear la extracción usted mismo.

Demo: Demos\04.WebSocket_Other_Samples\16.APIKeyManager.

Cliente Forex.com + Lightstreamer genérico

El nuevo cliente TsgcWSAPI_Forex ofrece acceso REST + streaming unificado a Forex.com (inicio de sesión, ping, vigilancia de mercado, posiciones, órdenes, historial de operaciones, simulación de operaciones). Está construido sobre un nuevo componente TsgcWSPClient_Lightstreamer, un cliente genérico de Lightstreamer TLCP 2.5 que implementa create_session, bind_session, control (subscribe / unsubscribe) y la reconexión automática LOOP + reproducción de suscripciones tras la reconexión. El cliente de Lightstreamer es reutilizable por sí mismo, de modo que la misma base de código funciona con IG Markets y cualquier otro feed respaldado por Lightstreamer.

uses sgcHTTP_API_Forex;

var oFX: TsgcWSAPI_Forex;
begin
  oFX := TsgcWSAPI_Forex.Create(nil);
  oFX.UserName  := 'demo-user';
  oFX.Password  := 'secret';
  oFX.AppKey    := 'your-app-key';
  oFX.Login;
  oFX.SubscribePrices(['EUR/USD', 'GBP/USD', 'XAU/USD']);
  oFX.OnPriceUpdate := procedure(const aSymbol: string; aBid, aAsk: Double)
                      begin
                        ShowMessage(Format('%s %.5f / %.5f', [aSymbol, aBid, aAsk]));
                      end;
end;

Una demo GUI completa vive en Demos\05.Crypto\22.Forex — inicio de sesión, ping de conectividad, vigilancia de mercado en vivo, posiciones, órdenes activas, historial de operaciones, historial de stop / limit y simulación de operaciones, con las credenciales persistidas en sgcForexDemo.ini.

Servidor MCP — OAuth 2.1 para clientes MCP basados en navegador

El servidor MCP ahora puede hablar directamente con conectores MCP basados en navegador (como claude.ai) sin un servidor de autorización externo. Publica automáticamente los cuatro endpoints de descubrimiento / registro de OAuth requeridos por la especificación de conector MCP de navegador, ejecuta un flujo de autorización PKCE-S256 con una pantalla de consentimiento HTML y emite tokens de refresco:

CORS se gestiona en línea: el preflight OPTIONS devuelve 204 con todas las cabeceras Access-Control-* antes de la autenticación, cada respuesta lleva una Access-Control-Allow-Origin que refleja el origen de la solicitud y una cabecera HSTS Strict-Transport-Security: max-age=31536000.

IOCP y EPOLL: seis mejoras de ajuste

Los motores de E/S IOCP de Windows y EPOLL de Linux recibieron una ronda enfocada de trabajo de rendimiento y ajuste.

IOCP (Windows)

oServer.Bindings.Add.Port := 443;
oServer.IOHandler := TsgcIndy_IOHandler_IO_IOCP.Create(oServer);
with TsgcIndy_IOHandler_IO_IOCP(oServer.IOHandler) do
begin
  SendBufferSize    := 256 * 1024;
  ReceiveBufferSize := 256 * 1024;
  TCPNoDelay        := True;
  Engine.ThreadAffinity := True;
end;

EPOLL (Linux)

Compartido

El grupo de trabajadores IOCP / EPOLL solía hacer sleep(1) en cada iteración incluso justo después de procesar una tarea — limitando efectivamente cada trabajador a ~1.000 ops/s incluso cuando la cola estaba llena. La pausa ahora se omite mientras haya trabajo esperando, eliminando el límite.

HTTP.sys: modo de alto rendimiento opcional

El servidor HTTP.sys gana una propiedad FineTune con un selector OperatingMode. El valor por defecto ompClassic preserva el comportamiento existente. El nuevo modo ompHighPerf implementa el patrón MSDN de N-trabajadores × M-recepciones-asíncronas-prepublicadas — la arquitectura recomendada para despliegues HTTP.sys de alto rendimiento — tras una sola propiedad:

oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.HTTP2Options.SecureOptions.HTTPAPI := True;   // use HTTP.sys
oServer.FineTune.OperatingMode := ompHighPerf;
oServer.FineTune.WorkerCount   := 8;
oServer.FineTune.PrePostedReceivesPerWorker := 16;
oServer.Active := True;

THttpServerRequest y THttpServerResponse también se han ampliado con campos adicionales que cubren detalles que antes solo estaban disponibles mediante análisis manual.

Primitiva poscuántica: ML-KEM-768

Una adición pequeña pero con visión de futuro: sgcKEM_CreateMLKEM768Keys genera un par de claves ML-KEM-768 (FIPS 203 / Kyber-768) tanto en formato PEM como en bytes en bruto. ML-KEM es el KEM poscuántico estandarizado por NIST y en la hoja de ruta del IETF para TLS 1.3 híbrido (X25519MLKEM768). Esto desbloquea la experimentación con handshakes preparados para PQ antes de la próxima base OpenSSL 3.5 / 3.6.

uses sgcKEM;

var vPubPEM, vPrivPEM: string; vPubRaw, vPrivRaw: TBytes;
begin
  sgcKEM_CreateMLKEM768Keys(vPubPEM, vPrivPEM, vPubRaw, vPrivRaw);
  TFile.WriteAllText('mlkem768_pub.pem', vPubPEM);
  TFile.WriteAllText('mlkem768_priv.pem', vPrivPEM);
end;

Correcciones de fiabilidad y conformidad

El lote de correcciones de errores cierra una larga lista de incidencias de MCP, HTTP.sys, IOCP y HTTP/2. Aspectos destacados:

Actualización

2026.5 es una actualización directa para proyectos 2026.4 existentes. No se realizaron cambios de interfaz en los componentes existentes; los nuevos componentes de limitación de tasa / disyuntor / clave API son aditivos y opcionales. El modo de alto rendimiento de HTTP.sys está protegido tras FineTune.OperatingMode := ompHighPerf — el código existente permanece en la ruta clásica.

Los clientes con una suscripción activa pueden descargar la nueva compilación desde el área de clientes. Los usuarios de la versión de prueba pueden obtener el instalador actualizado en esegece.com/products/sgcwebsockets/sgcwebsockets-download.

¿Preguntas, comentarios o ayuda con la migración? Póngase en contacto — obtendrá una respuesta de las personas que escribieron el código.