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:
GET /.well-known/oauth-authorization-server— RFC 8414-Metadaten.GET /.well-known/oauth-protected-resource— RFC 9728-Protected-Resource-Metadaten.POST /oauth/register— RFC 7591 dynamische Client-Registrierung.GET /oauth/authorize— HTML-Einwilligungsformular.POST /oauth/token— PKCE S256 + Refresh-Tokens.
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)
ThreadAffinity(StandardFalse) aufTsgcIndy_IO_Engine— Engine-Threads im Round-Robin-Verfahren überSetThreadAffinityMaskan logische Kerne binden. Reduziert kernübergreifenden Cache-Verkehr auf Systemen mit hoher Kernanzahl.Metrics— ein neuerTsgcIndy_IO_EngineMetrics-Record (AcceptsPosted,AcceptsCompleted,ReadsPosted,ReadsCompleted,ActiveConnections,BytesRead,BytesWritten), aktualisiert unter einem Critical Section. Kein Rätselraten mehr.SendBufferSize,ReceiveBufferSize,TCPNoDelayaufTsgcIndy_IOHandler_IO_IOCP— inAfterAcceptübersetsockoptangewendet, sodass die Feinabstimmung pro Verbindung keinen benutzerdefiniertenOnConnect-Handler mehr erfordert.TsgcPerIoDataPool-Kapazität von 256 auf 2048 erhöht, wodurch derGetMem/FreeMem-Heap-Fallback bei hoher Verbindungs-Gleichzeitigkeit vermieden wird. +15–18% WebSocket-Durchsatz bei Loopback-Benchmarks.
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)
AcceptBatchSize,WaitTimeoutMS,HandshakeTimeoutMS— Feinabstimmung der Accept-Schleife und des Slow-Loris-Schutzes.- EPOLLOUT-gesteuerter Schreib-Backpressure — wenn
send()bei einem teilweisen SchreibvorgangEAGAINzurückgibt, werden die verbleibenden Bytes in einem ausstehenden Puffer pro Verbindung erfasst, und der Socket wird mitEPOLLIN|EPOLLOUTerneut bewaffnet. Der Reaktor schreibt das Tail beim nächstenEPOLLOUT-Ereignis, anstatt die Bytes zu verwerfen oder den Worker zu blockieren.
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:
- MCP Server — fehlende oder ungültige Anmeldedaten geben jetzt
401 Unauthorizedmit einemWWW-Authenticate: Bearer-Header zurück, der auf die Protected-Resource-Metadaten verweist, anstelle von500 Internal Server Error. Erforderlich für OAuth-Discovery durch browserbasierte MCP-Clients. - MCP Server —
OPTIONS-Anfragen treffen nicht mehr den JSON-RPC-Parser (gab zuvor500 "Invalid jsonrpc Value"zurück). CORS-Preflight wird jetzt vor der Authentifizierung und vor dem MCP-Body-Parser behandelt. - MCP Server — Tool-Beschreibungen, Prompt-Nachrichten und Ressourceninhalte, die Nicht-ASCII-Zeichen enthalten, unterbrechen die Verbindung nicht mehr (der JSON-Body passt jetzt zum deklarierten
charset=utf-8). - MCP Server —
tool- /prompt- /resource- /root- /template- / Completion-Ref- und Completion-Argument-name-Felder, die Nicht-ASCII-Zeichen enthalten, werden jetzt ordnungsgemäß als JSON-\uXXXX-Escapes anstelle von Roh-UTF-16-Codepoints ausgegeben und gelesen. - HTTP-API-Request-Body —
TsgcWSComponent_Server.DoHTTPRequestAPIriefReadStringFromStreamohne Angabe einer Kodierung auf, was standardmäßig ASCII verwendete und jedes Nicht-ASCII-Byte durch?ersetzte, bevor Event-Handler es sahen. Behoben. - HTTP.sys-Server — Context-Leak bei
ERROR_MORE_DATAinTsgcHTTPServerAPI.DoExecute. Die Accept-Schleife vergrößert jetzt den Puffer und wiederholtHttpReceiveHttpRequestmit derselben Request-ID und gibt verwaiste Kontexte auf allen Fehlerpfaden frei. - HTTP.sys-Server —
TsgcWSConnectionServer_HTTPAPI.DoSendHTTP_ResponsesetztHTTP_SEND_RESPONSE_FLAG_MORE_DATAnicht mehr auf der finalen Antwort. - IOCP IOHandler —
TsgcIndy_IO_Engine_IOCP_Base.DoStopThreadsriefWaitForMultipleObjectsauf einem Array vonDWORD-Thread-IDs (FThreadsId) anstelle von Thread-HANDLEs auf. Behoben. - IOCP IOHandler — ausstehende I/O-Operationen auf Sockets werden jetzt beim Herunterfahren und beim Schließen pro Socket abgebrochen.
- IOCP IOHandler — die fragile
Overlapped.Internal = STATUS_PENDING-Prüfung inDoFreePerIoDatawird durch ein explizitesCompleted: Boolean-Flag aufTsgcPerIoDataersetzt. - HTTP/2 WebBrokerBridge — Invalid pointer operation bei
sgcFree(oResponse)inTsgcWSHTTPServer.OnHTTP2RequestEvent, wenn DataSnap REST einen HTTP/2-HEADERS-only-Frame behandelte.
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.
