sgcWebSockets 2026.7: Kümeleme, Mesaj Geçmişi, async / await ve Sağlamlaştırılmış İstemciler | eSeGeCe Blog

sgcWebSockets 2026.7: Kümeleme, Mesaj Geçmişi, async / await ve Sağlamlaştırılmış İstemciler

· Sürümler

sgcWebSockets 2026.7 üretim ortamında çalışmakla ilgili. Artık bir WebSocket uygulamasını birkaç sunucuya yayabilir ve kanalları, pub/sub ile varlık bilgisini hepsinde birden çalışır durumda tutabilirsiniz. Kanallar son mesajlarını hatırlayabilir, böylece kopup geri dönen bir istemci kaçırdığı her şeyi alır. İstemciler, sunucuyu aynı anda hep birlikte zorlamak yerine üstel geri çekilme ve rastgele sapma ile yeniden bağlanır, gönderim kuyruğu sınırlandırılabilir, böylece tek bir yavaş tüketici sunucu belleğini tüketemez ve HTTP istemcisi kimlik bilgilerini sızdıran yönlendirmelere, düşürülmüş TLS bağlantılarına ve boyut sınırı olmayan yanıtlara karşı bir dizi koruma kazandı.

Bunların üstüne, Delphi için bir async / await katmanı, HTTP sunucularında gzip ve deflate, yeni HTTP QUERY metodu, uçtan uca şifreleme için kimlik doğrulama, MCP istemcisinde OAuth2 ve uzun bir düzeltme listesi geliyor. Bu yazı rehberli bir tur. Her bölüm, ilgili özelliği derinlemesine anlatan makaleye bağlantı veriyor.

Birkaç sunucuya yayılan kümeleme

Yeni TsgcWSCluster bileşeni, birkaç sgcWebSockets sunucusunu tek bir mantıksal sunucuya bağlar. A düğümünde yayımlanan bir mesaj, B düğümüne bağlı abonelere ulaşır ve varlık bilgisi yalnızca yerel düğümün değil, tüm kümenin listesini döndürür. İki arka düzlem mevcut: düğümlerin birbirleriyle doğrudan konuştuğu ve fazladan hiçbir şey kurmadığınız yerleşik bir mesh, ve daha büyük dağıtımlar için Redis Pub/Sub (Enterprise).

uses
  sgcWebSocket, sgcWebSocket_Protocols, sgcWebSocket_Cluster;

oCluster := TsgcWSCluster.Create(nil);
oCluster.EngineType  := clusterMesh;          // no extra infrastructure
oCluster.ClusterPort := 5410;                 // this node's mesh listener
oCluster.Peers.Add('192.168.1.101:5410');     // the other nodes
oCluster.Attach(oProtocol);                   // cluster this protocol's pub/sub
oCluster.Start;

Daha fazlası: WebSocket Sunucularını Birden Fazla Düğüme Ölçekleyin.

Mesaj geçmişi ve yeniden bağlanma kurtarması

sgc protokol sunucusu artık her kanalın son N mesajını, isteğe bağlı olarak bir yaşam süresiyle birlikte saklayabiliyor. Bir istemci yeniden bağlanıp yeniden abone olduğunda, gerçekten gördüğü son mesajın konumunu gönderir ve sunucu, o yokken yayımlanan her şeyi yeniden oynatır. İstemci kodunuzda, zaten yaptığınız yeniden abonelik dışında hiçbir şey değişmez ve siz etkinleştirmediğiniz sürece tüm bu mekanizma kapalı kalır.

oProtocol.History.Enabled    := True;
oProtocol.History.Size       := 1000;   // last 1000 messages per channel
oProtocol.History.TTLSeconds := 3600;   // optional: also expire after 1 hour

Daha fazlası: Mesaj Geçmişi ve Yeniden Bağlanma Kurtarması.

async / await ve gerçekten bekleyen bir Connect

Yeni sgcBase_AsyncAwait birimi, kütüphaneye görevleri ve gelecekleri getiriyor. Tek bir olay işleyicisi bağlamadan bir HTTP isteğini, bir WebSocket bağlantısını ya da bir AI sohbet tamamlamasını bekleyebilir, sonucu ThenProc ve OnError ile zincirleyebilir ve bir görevi, alttaki isteği gerçekten iptal edecek şekilde durdurabilirsiniz.

Aynı ruhla, Connect artık bağlantı yalnızca başlatılana kadar değil, tamamen kurulana kadar bloke ediyor ve Disconnect, soket gerçekten kapanana kadar bekliyor. Bu, hızlı yeniden bağlanmalarda başınızı ağrıtan bir yarış durumunu kapatıyor. Bir bağlanma ya da gönderme başarısız olduğunda, nedeni yeni LastError özelliğinde bulunuyor ve hata metnini doğrudan size geri veren bir Connect aşırı yüklemesi de var, böylece bir hatayı OnError olayına abone olmadan teşhis edebiliyorsunuz.

var
  vError: string;
begin
  if sgcWebSocketClient1.Connect(10000) then
    sgcWebSocketClient1.WriteData('hello')
  else
    ShowMessage('Connect failed: ' + sgcWebSocketClient1.LastError);

  // or get the reason back directly from the call
  if not sgcWebSocketClient1.Connect(vError, 10000) then
    ShowMessage('Connect failed: ' + vError);
end;

Daha fazlası: Delphi'de async / await.

HTTP istemcisini sağlamlaştırmak

Bir jetonu kaybetmenin en kolay yolu bir yönlendirmedir. Bir sunucu, kimliği doğrulanmış isteğinize farklı bir ana bilgisayara giden 302 ile yanıt verirse, istemci Authorization ve Cookie başlıklarını seve seve oraya da yollar. 2026.7, siteler arası bir yönlendirmede bunları düşürmek için StripAuthOnCrossHostRedirect ve HTTPS bağlantısını düz HTTP'ye düşüren bir yönlendirmeyi reddetmek için NoInsecureRedirect ekliyor.

Yanıtlar da artık sınırlandırılabiliyor, parçalı bir yanıtın tek bir parçası için MaxChunkSize ve toplam için MaxResponseSize ile. RejectPublicSuffixCookies, "com" veya "co.uk" gibi aşırı geniş alanlar için talep edilen çerezleri atar. Yüklemeler için, büyük bir gövde göndermeden önce sunucudan izin isteyen Expect: 100-continue ve boyutunu henüz bilmediğiniz bir yüklemeyi akışla göndermek için parçalı bir istek gövdesi var.

oHTTP.StripAuthOnCrossHostRedirect := True;
oHTTP.NoInsecureRedirect           := True;
oHTTP.MaxResponseSize              := 10 * 1024 * 1024;  // 10 MB, 0 = unlimited
oHTTP.MaxChunkSize                 := 1024 * 1024;       // 1 MB per chunk
oHTTP.RejectPublicSuffixCookies    := True;

Bu anahtarların hepsi varsayılan olarak kapalı ve hiçbiri düşük seviyeli HTTP nesnesine uzanmanızı gerektirmiyor: hazır gelen API istemcilerinde de yayımlanmış durumdalar (AI/LLM, kripto borsaları, OAuth2, Google Cloud, WhatsApp, AWS SQS, WebPush). Yönlendirme ve boyut korumaları HTTP/2 istemcisinde de var, HTTP/3 ise yanıt boyutu sınırını kazanıyor. Daha fazlası: HTTP İstemcisini Sağlamlaştırmak.

Yeniden denemeler, geri çekilme ve rastgele sapma

WatchDog eskiden sabit bir aralıkla yeniden bağlanıyordu, bu da sunucuyu kaybeden bin istemcinin hepsinin aynı anda geri gelmesi demekti. Artık bir çarpan, bir üst sınır ve rastgele bir sapma ile üstel geri çekilmeyi destekliyor, böylece filo kendini zamana yayıyor. Sabit aralık varsayılan olarak kalıyor, dolayısıyla siz istemedikçe hiçbir şey değişmiyor.

HTTP istemcisi kendine ait bir yeniden deneme ilkesi kazandı: yapılandırılabilir bir durum kodu listesinde yeniden dene, her seferinde daha uzun bekle ve sunucu bir Retry-After ipucu gönderdiğinde ona uy. OpenAI, Anthropic ve Gemini istemcileri de bunu kullanıyor.

sgcWebSocketClient1.WatchDog.Backoff           := wdbExponential;
sgcWebSocketClient1.WatchDog.BackoffMultiplier := 2.0;   // double every attempt
sgcWebSocketClient1.WatchDog.MaxInterval       := 60;    // seconds, the ceiling
sgcWebSocketClient1.WatchDog.Jitter            := 0.2;   // up to 20% random spread

Daha fazlası: Üstel Geri Çekilme, Rastgele Sapma ve Retry-After.

Gönderim kuyruğunda geri basınç

Bir istemci sizin yazdığınızdan daha yavaş okuduğunda, kuyruğa alınan mesajlar sunucu belleğinde birikir. Artık bağlantı başına bekleyen mesaj sayısını QueueOptions.MaxQueueSize ile sınırlayabilir ve sınıra ulaşıldığında ne olacağını seçebilirsiniz: en eski mesajı at, en yenisini at ya da bağlantıyı kes. Yeni OnSendBufferFull olayı, hiçbir şey atılmadan önce tetiklenir, böylece bunu kayda alabilir, sayabilir ya da kesintiye uğratmayı göze alamayacağınız bir bağlantı için atılmasını veto edebilirsiniz. Kuyruk varsayılan olarak sınırsızdır.

oServer.QueueOptions.MaxQueueSize   := 1000;
oServer.QueueOptions.OverflowPolicy := qopDropOldest;  // or qopDropNewest, qopDisconnect

Daha fazlası: Yavaş WebSocket İstemcileri için Gönderim Kuyruğu Sınırları.

HTTP sunucusunda gzip ve deflate

HTTP sunucuları artık istemci Accept-Encoding bildirdiğinde yanıtlarını sıkıştırabiliyor. Bu, DocumentRoot üzerinden sunulan dosyalar için ve OnCommandGet içinde kendiniz oluşturduğunuz yanıtlar için geçerli, asgari boyutun altındaki gövdeleri ve daha küçük olmayacak içerik tiplerini atlıyor ve HTTP.sys sunucusunda da kullanılabiliyor. Sıkıştırma varsayılan olarak kapalı ve şimdilik yalnızca HTTP/1.1 yanıtları sıkıştırılıyor.

sgcWebSocketHTTPServer1.HTTPCompression.Enabled := True;
sgcWebSocketHTTPServer1.HTTPCompression.Level   := 6;     // 1..9
sgcWebSocketHTTPServer1.HTTPCompression.MinSize := 1024;  // bytes

Daha fazlası: HTTP Sunucusunda gzip ve deflate Sıkıştırması.

HTTP QUERY metodu

QUERY, bir aramayı POST gibi istek gövdesinde gönderen, ancak GET gibi güvenli ve önbelleklenebilir kalan yeni bir IETF HTTP metodudur, dolayısıyla sorgunuz artık uzunluk sınırı olan bir URL'ye sıkıştırılmak zorunda değil. 2026.7 bunu HTTP/1.x, HTTP/2, HTTP/3 ve REST istemcilerinde uyguluyor, sunucular ve vekil sunucu da bunu işliyor.

vResult := oClient.Query('https://api.example.org/contacts', oQuery);

Daha fazlası: Delphi'de Yeni HTTP QUERY Metodu.

E2EE kimlik doğrulama

Uçtan uca şifreleme yükü gizli tutar, ancak tek başına hattın diğer ucunda kimin olduğunu size söylemez. Aradaki bir sunucu ya da aktarıcı, her iki tarafa kendi anahtarını verip her şeyi okuyabilir. 2026.7 ile her taraf, şifreleme anahtarını uzun ömürlü bir kimlik anahtarıyla imzalayabiliyor ve diğer taraf bu imzayı doğruluyor, böylece sessiz bir anahtar değişimi kabul edilmek yerine tespit ediliyor.

Bire bir ve grup sohbetleri için çalışır, bir eşin kimliğini onaylamak ya da sabitlemek için ve bir eşin kimlik anahtarı değiştiğinde sizi uyarmak için olaylar ekler, varsayılan olarak kapalıdır ve 2026.6 eşleriyle tamamen geriye dönük uyumludur.

E2EE.E2EE_Options.Identity.Enabled    := True;
E2EE.E2EE_Options.Identity.PrivateKey := LoadIdentityPrivateKey;  // PEM
E2EE.E2EE_Options.Identity.PublicKey  := LoadIdentityPublicKey;   // PEM
E2EE.OnE2EEVerifyPeerIdentity := OnE2EEVerifyPeerIdentityEvent;
E2EE.OnE2EEKeyChange          := OnE2EEKeyChangeEvent;

Daha fazlası: E2EE Kimlik Doğrulama.

MCP istemcisi için OAuth2 ve Identity Assertion grant tipi

MCP istemcisi artık sabit bir API anahtarı yerine OAuth2 ile kimlik doğrulaması yapabiliyor. Jetonu kendisi alır, süresi dolana kadar önbellekte tutar ve yeniler, OAuth2 etkinken de API anahtarına göre öncelik kazanır. Bunun yanında OAuth2 istemcisi, bir kimliği bir alandan diğerine zincirleyen yeni bir grant tipi olan Identity Assertion Authorization Grant tipini kazanıyor: istemci çok adımlı takasın tamamını sizin yerinize yürütür ve her adımı izleyebilmeniz için olaylar tetikler.

MCPClient.MCPOptions.AuthenticationOptions.OAuth2.Enabled := True;
MCPClient.MCPOptions.AuthenticationOptions.OAuth2.GrantType := auth2ClientCredentials;
MCPClient.MCPOptions.AuthenticationOptions.OAuth2.TokenURL := 'https://auth.example.com/oauth2/token';
MCPClient.MCPOptions.AuthenticationOptions.OAuth2.ClientId := 'YOUR_CLIENT_ID';
MCPClient.MCPOptions.AuthenticationOptions.OAuth2.ClientSecret := 'YOUR_CLIENT_SECRET';

Daha fazlası: MCP İstemcisi için OAuth2.

Kripto akışları: yeniden abonelik ve hız sınırlama

Şimdiye kadar, bir piyasa verisi soketi koptuğunda ve WatchDog onu geri getirdiğinde, soket ayaktaydı ama her aboneliği kendiniz yeniden oynatana kadar hiçbir şeye abone değildiniz. Borsa istemcileri artık bunu sizin yerinize yapabiliyor: Resubscribe := True ayarlayın ve akışlarınız yeniden bağlanmanın ardından geri yüklensin. Binance, Kraken, Coinbase ve yaklaşık on dört borsayı daha, ayrıca XTB'nin oturum tabanlı beslemesini kapsıyor. Varsayılan değeri False.

REST API istemcileri isteğe bağlı, istemci taraflı bir hız sınırlayıcı kazanıyor, böylece bir istek patlaması bir borsa tarafından geçici olarak yasaklanmanıza yol açmıyor. Bir zaman penceresinde kaç istek göndereceğinizi sınırlayın ve fazla bir isteğin bekleyecek mi yoksa reddedilecek mi olduğunu seçin. Varsayılan olarak kapalı.

oBinance.RateLimit.Enabled     := True;
oBinance.RateLimit.IntervalMs  := 60000;   // one minute window
oBinance.RateLimit.MaxRequests := 1000;
oBinance.RateLimit.Behavior    := rlbWait;

Daha fazlası: Yeniden Abonelik ve İstemci Taraflı Hız Sınırlayıcı.

Daha küçük eklemeler

Düzeltmeler ve sağlamlaştırma

2026.7 uzun bir düzeltme listesi taşıyor. Hepsini tekrarlamak yerine, toplamda neye vardıklarını anlatalım.

Bellek güvenliği ve ayrıştırıcı sağlamlaştırması. Tampon sonunun ötesine yapılan okumalar şu yerlerde düzeltildi: MQTT 5 istemcisi (gönderdiğinden fazla veri olduğunu iddia eden bir aracı), AMQP 1.0 istemcisi (UUID kod çözme), STUN/TURN ayrıştırıcısı (sonsuz bir döngü ve IPv6 adresleri dahil), WebRTC SCTP veri kanalı ve ham TCP çerçeve tarayıcısı. DTLS dahil olmak üzere UDP istemcisi ve sunucusu, artık bir soketi iki kez serbest bırakmıyor ya da bağlantı kesildiğinde askıda bırakmıyor. Hatalı davranan bir eşin belleği sınırsızca büyütebileceği yerlere dahili üst sınırlar eklendi: MQTT bekleyen mesaj kuyruğu, sgc protokolünün bağlantı başına abonelikleri, WAMP sunucusunun bekleyen çağrıları, parçalı bir yanıtın kuyruk satırları ve AMQP alan tablolarının iç içe geçme derinliği.

HTTP/2. Sıkıştırma açılmış boyut için bir üst sınır (varsayılan 64 MB), "zip bomb" yanıtlarıyla ortaya çıkan bir bellek tükenmesi açığını kapatıyor, yanıt boyutu sınırı artık bir yanıtın son parçasıyla atlatılamıyor ve başarısız bir istek artık tüm zaman aşımı süresini beklemek yerine hemen başarısız oluyor.

Kriptografi ve rastgelelik. WebAuthn sunucusu, OAuth2 yetkilendirme sunucusu ve yerleşik HTTP oturum kimlikleri artık kriptografik olarak güvenli bir rastgele üreteç kullanıyor, meydan okumalar tek kullanımlık ve gizli değerler sabit zamanda karşılaştırılıyor (istemci gizli anahtarı, JWT imzası, HTTP API Basic parolası). Geçerli imzası olan ancak hatalı bir talep içeren bir JWT artık kabul edilmek yerine reddediliyor. OpenSSL ile StrictVerify etkinken, sertifika ana bilgisayar adına karşı da denetleniyor, dolayısıyla farklı bir ana bilgisayar için düzenlenmiş geçerli bir sertifika reddediliyor. Bir IP adresine yapılan bağlantılar ve mevcut ayarlar bundan etkilenmiyor.

Server-Sent Events. Tek bir okumada birkaç olay ileten ya da iki okumaya bölünmüş bir olay içeren akışlı bir yanıtta, ilki dışındaki her şey kayboluyordu. Bu düzeltildi ve böylece AI/LLM istemcileri için jeton jeton akış geri geldi. OpenAI akışlı sohbeti ayrıca akış bayrağını ayarlamıyordu, artık diğer sağlayıcılar gibi akış yapıyor.

Borsa istemcileri. Kraken istek kimlikleri artık kesin olarak artıyor, BitMEX son kullanma süresini milisaniye yerine saniye olarak gönderiyor, MEXC gerçekten gönderdiği kodlanmış parametreleri imzalıyor, Cryptorobotics hash tabanlı çağrılarda artık iki değeri birbiriyle değiştirmiyor, Deribit oturum açma jetonunu süresi dolmadan yeniliyor ve Forex istemcisi, hesap kimliğini okurken eskiden yuttuğu hatayı raporluyor.

Lazarus ve Free Pascal. Üç derleme düzeltmesi: JSON biriminin arayüzleri artık platform başına doğru çağrı kuralını kullanıyor (Linux'ta derlenmiyorlardı), Forex istemcisi sayı biçimini okumak için artık yalnızca Delphi'ye özgü bir fonksiyonu çağırmıyor ve kuantum sonrası anahtar değişimi birimi artık size_t tipine bağımlı değil.

history.txt dosyasında daha fazlası var: gRPC istemcisi (eşzamanlı çağrılar birbirlerinin yanıtlarını alabiliyordu ve bir gönderme hatası başarı olarak raporlanıyordu), OpenAPI sunucusu (spesifikasyon yükleme artık iş parçacığı güvenli ve işleyicileriniz artık dahili bir kilit tutulurken çalışmıyor), her başarısız oturum açmada oluşan bir sunucu bağlantısı ve soket sızıntısı, Ollama ile LM Studio'dan gelenler gibi "message" alanı olmayan OpenAI yanıtlarında oluşan bir çökme, WinHTTP istemcisinde düzeltilen bir WriteAndWaitData ve HTTP istemci günlüğünde gizli değerlerin gizlenmesi, böylece günlük kaydını açmak artık jetonları diske açık metin olarak yazmıyor.

.NET sürümü

sgcWebSockets .NET 2026.7 HTTP istemcisine odaklanıyor. Delphi sürümüyle aynı koruma setini getiriyor: siteler arası bir yönlendirmede kimlik bilgilerinin çıkarılması, HTTPS bağlantısının HTTP'ye düşürülmesinin engellenmesi, parça başına ve toplam yanıt boyutu üst sınırları, genel son ek çerezlerinin reddedilmesi, Expect: 100-continue ve parçalı istek gövdeleri. Bunlar HTTP istemci bileşenlerinde ve hazır gelen API istemcilerinde (AI/LLM istemcileri, OAuth2, Google Cloud, WhatsApp, AWS SQS, WebPush) kullanılabilir ve aynı yönlendirme ile boyut korumaları HTTP/2 istemcisinde de var. Yönlendirme işleme ve çerez son kullanma düzeltmeleri de dahil. Her şey varsayılan olarak kapalı.

Yükseltme

2026.7, mevcut 2026.x projeleri için doğrudan yerine oturan bir yükseltmedir. Bu sürümdeki her yeni özellik varsayılan olarak kapalıdır: kümeleme, mesaj geçmişi, geri çekilme, gönderim kuyruğu sınırı, HTTP sıkıştırması, istemci korumaları, E2EE kimlik doğrulama ve borsa yeniden aboneliği, hepsi açıkça açılmak zorundadır, dolayısıyla yeni yapıyı kurmak, siz tercih etmediğiniz sürece hiçbir davranışı değiştirmez.

Aktif aboneliği olan müşteriler yeni yapıyı müşteri alanından ya da esegece.com/products/websockets/download adresinden indirebilir.

Sorularınız, geri bildirimleriniz ya da geçiş yardımı mı gerekiyor? Bize ulaşın. Yanıtı kodu yazan kişilerden alacaksınız.