sgcWebSockets 2026.5 dolu dolu bir sürüm. Üç yeni altyapı bileşeni, WebSocket / HTTP sunucusunu üretim düzeyinde bir API ağ geçidine dönüştürür: tam donanımlı bir rate limiter, istemci tarafında bir circuit breaker ve tam yaşam döngüsü desteğine sahip bir API anahtarı yöneticisi. Protokol tarafında, genel bir Lightstreamer TLCP 2.5 uygulaması üzerine kurulu yeni bir Forex.com istemcisi vardır; MCP Server, claude.ai gibi tarayıcı tabanlı MCP istemcilerine doğrudan bağlanabilmesi için yerleşik bir OAuth 2.1 akışı kazanır ve IOCP (Windows) ile EPOLL (Linux) G/Ç motorları ölçülebilir altı performans kazanımı elde eder. Ayrıca erken bir post-quantum ilkel öğesi de var: ML-KEM-768 anahtar çifti üretimi için sgcKEM_CreateMLKEM768Keys.
Bu yazı, yeni bileşenler için yapıştırılmaya hazır Delphi parçacıklarıyla öne çıkan özellikleri ele alır.
TsgcWSRateLimiter — tak çalıştır API hız sınırlama
Sunucunuzun yanına bir TsgcWSRateLimiter ekleyin, IP başına, API anahtarı başına, kullanıcı başına veya uç nokta deseni başına token-bucket, sliding-window veya fixed-window hız sınırlamasının yanı sıra günlük/aylık kotalara ve ani artış (burst) korumasına sahip olursunuz. Bileşen iş parçacığı güvenlidir ve durumu diske kalıcı olarak kaydeder (böylece bir sunucu yeniden başlatması her istemciye sıfırdan bir kota vermez).
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;
Kural çözücü önce PerEndpoint (joker karakterle eşleştirilmiş), ardından PerAPIKey, PerUser ve son olarak PerIP sırasıyla ilerler. OnThrottled, OnQuotaExceeded ve OnStateChange olayları her kararı günlüğe kaydetmenize veya geçersiz kılmanıza olanak tanır.
Demo: Demos\04.WebSocket_Other_Samples\14.RateLimiter — canlı istatistikleri ve reddetme nedenlerini yayımlayan bir sunucuya karşı sel (flood) üreten bir istemci çalıştırır.
TsgcWSCircuitBreaker — istemci tarafında hata yalıtımı
Bir yukarı akış API'si (api.openai.com, bir ödeme ağ geçidi, dahili bir mikro hizmet) hata vermeye veya yavaşlamaya başladığında, TCP zaman aşımlarında takılı kalmak size bağlantılara, iş parçacıklarına ve paraya mal olur. TsgcWSCircuitBreaker, herhangi bir TsgcHTTPAPI_client alt sınıfının üzerine klasik üç durumlu deseni (closed / open / half-open) uygular; kayan bir zaman penceresi, yavaş çağrı algılama, isteğe bağlı geri dönüş (fallback) yanıtları ve uç nokta başına geçersiz kılmalar ile.
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;
Delphi 2009+ üzerinde tek satırlık bir sarmalayıcı da mevcuttur: oCB.Execute('openai', procedure begin oOpenAI.ChatCompletion(...) end); — başarı / başarısızlık kaydı otomatik olarak gerçekleşir.
Demo: Demos\04.WebSocket_Other_Samples\15.CircuitBreaker.
TsgcWSAPIKeyManager — tek bileşende anahtar yaşam döngüsü
Çoğu "WebSocket API" sunucusunun API anahtarlarına ihtiyacı vardır: oluşturma, doğrulama, iptal, döndürme. TsgcWSAPIKeyManager, kapsam tabanlı yetkilendirme, beklemede isteğe bağlı karma (hashing), sona erme, bir denetim günlüğü ve yerleşik bir döndürme tolerans süresi ile tüm yaşam döngüsünü sarmalar; böylece eski anahtarlar döndürmeden sonra yapılandırılabilir bir süre boyunca çalışmaya devam eder.
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;
Bileşen, anahtarı IsRequestAuthorized ile doğrudan gelen HTTP başlıklarından veya query string'den okuyabilir, böylece çıkarma işlemini kendiniz bağlamak zorunda kalmazsınız.
Demo: Demos\04.WebSocket_Other_Samples\16.APIKeyManager.
Forex.com istemcisi + genel Lightstreamer
Yeni TsgcWSAPI_Forex istemcisi, Forex.com'a birleşik REST + akış erişimi sunar (login, ping, market watch, pozisyonlar, emirler, işlem geçmişi, işlem simülasyonu). create_session, bind_session, control (subscribe / unsubscribe) ve yeniden bağlanma sonrası LOOP otomatik yeniden bağlama + abonelik tekrarını uygulayan genel bir Lightstreamer TLCP 2.5 istemcisi olan yepyeni bir TsgcWSPClient_Lightstreamer bileşeni üzerine kuruludur. Lightstreamer istemcisi tek başına yeniden kullanılabilir, dolayısıyla aynı kod tabanı IG Markets ve Lightstreamer destekli diğer her beslemeyle çalışır.
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;
Tam bir GUI demosu Demos\05.Crypto\22.Forex içinde bulunur — login, bağlantı ping'i, canlı market watch, pozisyonlar, aktif emirler, işlem geçmişi, stop / limit geçmişi ve işlem simülasyonu; kimlik bilgileri sgcForexDemo.ini dosyasına kalıcı olarak kaydedilir.
MCP Server — tarayıcı tabanlı MCP istemcileri için OAuth 2.1
MCP Server artık harici bir yetkilendirme sunucusu olmadan tarayıcı tabanlı MCP bağlayıcılarıyla (claude.ai gibi) doğrudan iletişim kurabilir. MCP tarayıcı-bağlayıcı spesifikasyonunun gerektirdiği dört OAuth keşif / kayıt uç noktasını otomatik olarak yayımlar, bir HTML onay ekranıyla bir PKCE-S256 yetkilendirme akışı çalıştırır ve yenileme tokenları verir:
GET /.well-known/oauth-authorization-server— RFC 8414 meta verisi.GET /.well-known/oauth-protected-resource— RFC 9728 korumalı kaynak meta verisi.POST /oauth/register— RFC 7591 dinamik istemci kaydı.GET /oauth/authorize— HTML onay formu.POST /oauth/token— PKCE S256 + yenileme tokenları.
CORS satır içinde ele alınır: OPTIONS ön kontrolü, kimlik doğrulamadan önce tam Access-Control-* başlıklarıyla 204 döndürür, her yanıt istek kaynağının bir Access-Control-Allow-Origin yansımasını ve bir Strict-Transport-Security: max-age=31536000 HSTS başlığını taşır.
IOCP ve EPOLL: altı ayarlama kazanımı
Windows IOCP ve Linux EPOLL G/Ç motorları, performans ve ayarlanabilirlik açısından odaklanmış bir çalışma turu gördü.
IOCP (Windows)
TsgcIndy_IO_EngineüzerindeThreadAffinity(varsayılanFalse) —SetThreadAffinityMaskaracılığıyla motor iş parçacıklarını round-robin olarak mantıksal çekirdeklere sabitler. Yüksek çekirdek sayılı sistemlerde çekirdekler arası önbellek trafiğini azaltır.Metrics— bir kritik bölüm altında güncellenen yeni birTsgcIndy_IO_EngineMetricskaydı (AcceptsPosted,AcceptsCompleted,ReadsPosted,ReadsCompleted,ActiveConnections,BytesRead,BytesWritten). Artık tahmin yürütmek yok.TsgcIndy_IOHandler_IO_IOCPüzerindeSendBufferSize,ReceiveBufferSize,TCPNoDelay—AfterAcceptiçindesetsockoptaracılığıyla uygulanır, böylece bağlantı başına ayarlama artık özel birOnConnectişleyicisi gerektirmez.TsgcPerIoDataPoolkapasitesi 256'dan 2048'e yükseltilerek yüksek bağlantı eşzamanlılığı altındaGetMem/FreeMemöbek (heap) geri dönüşünden kaçınılır. Loopback kıyaslamalarında +%15–18 WebSocket verimi.
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— kabul döngüsünü ve slow-loris korumasını ayarlar.- EPOLLOUT güdümlü yazma geri basıncı —
send()kısmi bir yazmadaEAGAINdöndürdüğünde, kalan baytlar bağlantı başına bir bekleme arabelleğinde yakalanır ve soketEPOLLIN|EPOLLOUTile yeniden hazırlanır. Reaktör, baytları atmak veya çalışanı bloke etmek yerine bir sonrakiEPOLLOUTolayında kalan kısmı boşaltır.
Paylaşılan
IOCP / EPOLL çalışan havuzu, bir görev işlendikten hemen sonrası dahil her yinelemede sleep(1) çağırıyordu — bu da kuyruk dolu olsa bile her çalışanı etkili biçimde ~1.000 işlem/sn ile sınırlıyordu. Uyku artık bekleyen iş varken atlanıyor, böylece bu sınır kaldırıldı.
HTTP.sys: isteğe bağlı yüksek performans modu
HTTP.sys sunucusu, bir OperatingMode seçicisine sahip bir FineTune özelliği kazanır. Varsayılan ompClassic mevcut davranışı korur. Yeni ompHighPerf modu, yüksek verimli HTTP.sys dağıtımları için önerilen mimari olan MSDN N-çalışan × M-önceden-gönderilmiş-async-alım desenini tek bir özelliğin arkasında uygular:
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 ve THttpServerResponse de, daha önce yalnızca manuel ayrıştırma yoluyla elde edilebilen ayrıntıları kapsayan ek alanlarla genişletildi.
Post-quantum ilkel öğe: ML-KEM-768
Küçük ama ileriye dönük bir ekleme: sgcKEM_CreateMLKEM768Keys, hem PEM hem de ham bayt biçiminde bir ML-KEM-768 (FIPS 203 / Kyber-768) anahtar çifti üretir. ML-KEM, NIST tarafından standartlaştırılan ve hibrit TLS 1.3 (X25519MLKEM768) için IETF yol haritasında yer alan post-quantum KEM'dir. Bu, yaklaşan OpenSSL 3.5 / 3.6 temelinden önce PQ'ye hazır el sıkışmalarıyla deney yapmanın önünü açar.
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;
Güvenilirlik ve uyumluluk düzeltmeleri
Hata düzeltme paketi, uzun bir MCP, HTTP.sys, IOCP ve HTTP/2 sorunları listesini kapatır. Öne çıkanlar:
- MCP Server — eksik veya geçersiz kimlik bilgileri artık
500 Internal Server Erroryerine, korumalı kaynak meta verisini işaret eden birWWW-Authenticate: Bearerbaşlığı ile401 Unauthorizeddöndürür. Tarayıcı tabanlı MCP istemcilerinin OAuth keşfi için gereklidir. - MCP Server —
OPTIONSistekleri artık JSON-RPC ayrıştırıcısına ulaşmıyor (önceden500 "Invalid jsonrpc Value"döndürüyordu). CORS ön kontrolü artık kimlik doğrulamadan ve MCP gövde ayrıştırıcısından önce ele alınıyor. - MCP Server — ASCII olmayan karakterler içeren araç açıklamaları, istem (prompt) mesajları ve kaynak içerikleri artık bağlantıyı bozmuyor (JSON gövdesi artık bildirilen
charset=utf-8ile eşleşiyor). - MCP Server — ASCII olmayan karakterler içeren
tool/prompt/resource/root/template/ completion-ref ve completion-argumentnamealanları artık ham UTF-16 kod noktaları yerine JSON\uXXXXkaçışları olarak düzgün şekilde yayımlanıp okunuyor. - HTTP API istek gövdesi —
TsgcWSComponent_Server.DoHTTPRequestAPI, bir kodlama belirtmedenReadStringFromStreamçağırıyor, varsayılan olarak ASCII'ye düşüyor ve olay işleyicileri görmeden önce ASCII olmayan her baytı?ile değiştiriyordu. Düzeltildi. - HTTP.sys Server —
TsgcHTTPServerAPI.DoExecuteiçindeERROR_MORE_DATAüzerinde bağlam sızıntısı. Kabul döngüsü artık arabelleği büyütüyor ve aynı istek kimliğindeHttpReceiveHttpRequest'i yeniden deniyor, ayrıca tüm hata yollarında sahipsiz bağlamları serbest bırakıyor. - HTTP.sys Server —
TsgcWSConnectionServer_HTTPAPI.DoSendHTTP_Responseartık son yanıttaHTTP_SEND_RESPONSE_FLAG_MORE_DATAayarlamıyor. - IOCP IOHandler —
TsgcIndy_IO_Engine_IOCP_Base.DoStopThreads, iş parçacığı HANDLE'ları yerine birDWORDiş parçacığı kimlikleri dizisinde (FThreadsId)WaitForMultipleObjectsçağırıyordu. Düzeltildi. - IOCP IOHandler — soketlerdeki bekleyen G/Ç işlemleri artık kapatma sırasında ve soket başına kapatmada iptal ediliyor.
- IOCP IOHandler —
DoFreePerIoDataiçindeki kırılganOverlapped.Internal = STATUS_PENDINGyoklaması,TsgcPerIoDataüzerinde açık birCompleted: Booleanbayrağı ile değiştirildi. - HTTP/2 WebBrokerBridge — DataSnap REST yalnızca
HEADERSiçeren bir HTTP/2 çerçevesini ele aldığındaTsgcWSHTTPServer.OnHTTP2RequestEventiçindekisgcFree(oResponse)üzerinde Invalid pointer operation.
Yükseltme
2026.5, mevcut 2026.4 projeleri için tak çalıştır bir yükseltmedir. Mevcut bileşenlerde herhangi bir arayüz değişikliği yapılmadı; yeni rate-limit / circuit-breaker / API-anahtarı bileşenleri eklemelidir ve isteğe bağlıdır. HTTP.sys yüksek performans modu FineTune.OperatingMode := ompHighPerf arkasında kapalıdır — mevcut kod klasik yolda kalır.
Aktif aboneliği olan müşteriler yeni derlemeyi müşteri alanından indirebilir. Deneme kullanıcıları güncellenmiş yükleyiciyi şu adresten edinebilir: esegece.com/products/sgcwebsockets/sgcwebsockets-download.
Sorular, geri bildirim veya geçiş yardımı mı? Bize ulaşın — kodu yazan kişilerden bir yanıt alacaksınız.
