sgcWebSockets 2026.5 — Rate Limiter, Circuit Breaker, API-Schlüssel, MCP OAuth & schnelleres IOCP

· Versionen

sgcWebSockets 2026.5 ist eine gehaltvolle Version. Drei neue Infrastruktur-Komponenten verwandeln den WebSocket- / HTTP-Server in ein produktionsreifes API-Gateway: ein voll ausgestatteter Rate Limiter, ein clientseitiger Circuit Breaker und ein API-Schlüssel-Manager mit voller Lebenszyklus-Unterstützung. Auf der Protokollseite gibt es einen neuen Forex.com-Client, der auf einer generischen Lightstreamer TLCP 2.5-Implementierung aufbaut, der MCP Server erhält einen integrierten OAuth 2.1-Ablauf, sodass er sich direkt mit browserbasierten MCP-Clients wie claude.ai verbinden kann, und die I/O-Engines IOCP (Windows) und EPOLL (Linux) erhalten sechs messbare Performance-Gewinne. Außerdem gibt es eine frühe Post-Quanten-Primitive: sgcKEM_CreateMLKEM768Keys für die ML-KEM-768-Schlüsselpaar-Generierung.

Dieser Beitrag geht durch die Highlights mit einfügebereiten Delphi-Codeausschnitten für die neuen Komponenten.

TsgcWSRateLimiter — einsatzbereite API-Ratenbegrenzung

Platzieren Sie eine TsgcWSRateLimiter neben Ihrem Server, und Sie haben Token-Bucket-, Sliding-Window- oder Fixed-Window-Ratenbegrenzung pro IP, pro API-Schlüssel, pro Benutzer oder pro Endpunktmuster sowie tägliche/monatliche Kontingente und Burst-Schutz. Die Komponente ist Thread-sicher und persistiert den Zustand auf der Festplatte (sodass ein Server-Neustart nicht jedem Client ein frisches Kontingent gibt).

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;

Der Regel-Resolver durchläuft PerEndpoint (mit Wildcard-Abgleich), dann PerAPIKey, PerUser und schließlich PerIP. Die Ereignisse OnThrottled, OnQuotaExceeded und OnStateChange ermöglichen es Ihnen, jede Entscheidung zu protokollieren oder zu überschreiben.

Demo: Demos\04.WebSocket_Other_Samples\14.RateLimiter — führt einen Flut-erzeugenden Client gegen einen Server aus, der Live-Statistiken und Ablehnungsgründe veröffentlicht.

TsgcWSCircuitBreaker — clientseitige Fehlerisolierung

Wenn eine vorgeschaltete API (api.openai.com, ein Zahlungs-Gateway, ein interner Microservice) anfängt zu versagen oder langsam zu werden, kostet das Hängen an TCP-Timeouts Sie Verbindungen, Threads und Geld. TsgcWSCircuitBreaker implementiert das klassische Drei-Zustands-Muster (geschlossen / offen / halboffen) auf jeder TsgcHTTPAPI_client-Unterklasse, mit einem rollenden Zeitfenster, Erkennung langsamer Aufrufe, optionalen Fallback-Antworten und Überschreibungen pro Endpunkt.

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;

Auf Delphi 2009+ ist auch ein Einzeiler-Wrapper verfügbar: oCB.Execute('openai', procedure begin oOpenAI.ChatCompletion(...) end); — die Erfolgs- / Fehleraufzeichnung erfolgt automatisch.

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

TsgcWSAPIKeyManager — Schlüssel-Lebenszyklus in einer Komponente

Die meisten "WebSocket-API"-Server benötigen API-Schlüssel: ausstellen, validieren, widerrufen, rotieren. TsgcWSAPIKeyManager umschließt den vollständigen Lebenszyklus mit Scope-basierter Autorisierung, optionalem Hashing im Ruhezustand, Ablauf, einem Audit-Log und einer integrierten Rotations-Karenzzeit, sodass alte Schlüssel nach der Rotation für ein konfigurierbares Fenster weiterhin funktionieren.

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;

Die Komponente kann den Schlüssel mit IsRequestAuthorized direkt aus den eingehenden HTTP-Headern oder dem Query-String auslesen, sodass Sie die Extraktion nicht selbst verdrahten müssen.

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

Forex.com-Client + generischer Lightstreamer

Der neue TsgcWSAPI_Forex-Client bietet einheitlichen REST- + Streaming-Zugriff auf Forex.com (Login, Ping, Marktbeobachtung, Positionen, Aufträge, Handelshistorie, Handel simulieren). Er basiert auf einer brandneuen TsgcWSPClient_Lightstreamer-Komponente, einem generischen Lightstreamer TLCP 2.5-Client, der create_session, bind_session, control (subscribe / unsubscribe) sowie das LOOP-Auto-Rebind- + Abonnement-Replay nach Wiederverbindung implementiert. Der Lightstreamer-Client ist eigenständig wiederverwendbar, sodass dieselbe Codebasis mit IG Markets und jedem anderen Lightstreamer-gestützten Feed funktioniert.

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;

Eine vollständige GUI-Demo liegt in Demos\05.Crypto\22.Forex — Login, Konnektivitäts-Ping, Live-Marktbeobachtung, Positionen, aktive Aufträge, Handelshistorie, Stop- / Limit-Historie und Handel simulieren, mit in sgcForexDemo.ini persistierten Anmeldedaten.

MCP Server — OAuth 2.1 für browserbasierte MCP-Clients

Der MCP Server kann jetzt ohne externen Autorisierungsserver direkt mit browserbasierten MCP-Konnektoren (wie claude.ai) kommunizieren. Er veröffentlicht automatisch die vier OAuth-Discovery- / Registrierungs-Endpunkte, die von der MCP-Browser-Konnektor-Spezifikation gefordert werden, führt einen PKCE-S256-Autorisierungsablauf mit einem HTML-Einwilligungsbildschirm aus und stellt Refresh-Tokens aus:

CORS wird inline behandelt: OPTIONS-Preflight gibt 204 mit vollständigen Access-Control-*-Headern vor der Authentifizierung zurück, jede Antwort enthält eine Access-Control-Allow-Origin-Reflexion des Request-Origins und einen Strict-Transport-Security: max-age=31536000 HSTS-Header.

IOCP und EPOLL: sechs Tuning-Gewinne

Die Windows-IOCP- und Linux-EPOLL-I/O-Engines erhielten eine fokussierte Runde Performance- und Konfigurierbarkeits-Arbeit.

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)

Gemeinsam

Der IOCP- / EPOLL-Worker-Pool führte bei jeder Iteration ein sleep(1) aus — einschließlich direkt nach der Verarbeitung einer Aufgabe — und begrenzte so effektiv jeden Worker auf ~1.000 Ops/s, selbst wenn die Warteschlange voll war. Der Sleep wird jetzt übersprungen, solange Arbeit aussteht, wodurch die Obergrenze entfällt.

HTTP.sys: Opt-in-Hochleistungsmodus

Der HTTP.sys-Server erhält eine FineTune-Eigenschaft mit einem OperatingMode-Selektor. Der Standard ompClassic behält das bestehende Verhalten bei. Der neue ompHighPerf-Modus implementiert das MSDN N-Worker × M-vorab-veröffentlichte-asynchrone-Receives-Muster — die empfohlene Architektur für HTTP.sys-Bereitstellungen mit hohem Durchsatz — hinter einer einzigen Eigenschaft:

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 und THttpServerResponse wurden ebenfalls um zusätzliche Felder erweitert, die Details abdecken, die zuvor nur durch manuelles Parsen verfügbar waren.

Post-Quanten-Primitive: ML-KEM-768

Eine kleine, aber zukunftsweisende Ergänzung: sgcKEM_CreateMLKEM768Keys generiert ein ML-KEM-768- (FIPS 203 / Kyber-768) Schlüsselpaar sowohl in PEM- als auch in Rohbytes-Form. ML-KEM ist das von NIST standardisierte Post-Quanten-KEM und steht auf der IETF-Roadmap für hybrides TLS 1.3 (X25519MLKEM768). Dies ermöglicht das Experimentieren mit PQ-bereiten Handshakes vor der bevorstehenden OpenSSL 3.5 / 3.6-Basisversion.

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;

Zuverlässigkeits- und Konformitätskorrekturen

Das Bugfix-Paket schließt eine lange Liste von MCP-, HTTP.sys-, IOCP- und HTTP/2-Problemen. Highlights:

Upgrade

2026.5 ist ein einsatzbereites Upgrade für bestehende 2026.4-Projekte. An bestehenden Komponenten wurden keine Schnittstellenänderungen vorgenommen; die neuen Rate-Limit- / Circuit-Breaker- / API-Schlüssel-Komponenten sind additiv und Opt-in. Der HTTP.sys-Hochleistungsmodus ist hinter FineTune.OperatingMode := ompHighPerf abgegrenzt — bestehender Code bleibt auf dem klassischen Pfad.

Kunden mit einem aktiven Abonnement können den neuen Build aus dem Kundenbereich herunterladen. Testbenutzer können den aktualisierten Installer unter esegece.com/products/sgcwebsockets/sgcwebsockets-download erhalten.

Fragen, Feedback oder Hilfe bei der Migration? Kontaktieren Sie uns — Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.