Yeniden Bağlanmayı Atlatan Kripto Akışları ve Sizi Yasaklanmaktan Koruyan Bir Hız Sınırlayıcı | eSeGeCe Blog

Yeniden Bağlanmayı Atlatan Kripto Akışları ve Sizi Yasaklanmaktan Koruyan Bir Hız Sınırlayıcı

· Bileşenler

Bir kripto borsasıyla konuşan her uygulama, sonunda aynı iki tesisat parçasını yazmak zorunda kalır. Birincisi, soket koptuktan sonra piyasa verisi aboneliklerinizi geri yükler. İkincisi, borsanın sizi kısıtlamaması için REST çağrılarınızı yavaşlatır. İkisi de ilgi çekici kod değildir, ikisinde de ince hatalar yapmak kolaydır ve ikisi de şimdiye kadar uygulamaya bırakılmıştı.

sgcWebSockets 2026.7 bunları bileşenin içine alıyor. Borsa API istemcileri, yeniden bağlanmanın ardından kendi aboneliklerini yeniden oynatabiliyor ve hazır gelen her REST istemcisi artık bir zaman penceresinde kaç istek gönderdiğinizi sınırlayan istemci taraflı bir hız sınırlayıcıya sahip. Her ikisi de isteğe bağlıdır ve varsayılan olarak kapalıdır, dolayısıyla siz açana kadar yükseltme hiçbir şeyi değiştirmez.

Sizi hiçbir şeye abone bırakmayan yeniden bağlanma

WatchDog bağlantıyı geri getirme konusunda her zaman iyi olmuştur. Bir kablo çıkar, bir vekil sunucu zaman aşımına uğrar, borsa bir ağ geçidini yeniden başlatır ve birkaç saniye sonra istemci yeniden bağlanmıştır. O kısım çalışır.

Geri gelmeyen şey, abonelikleriniz. Borsanın onlara dair hiçbir hafızası yoktur. Yeni bir soket boş bir oturumdur, dolayısıyla eski sokette istediğiniz işlem ve emir defteri akışları artık basitçe var olmaz. Belirti can sıkıcıdır, çünkü hiçbir şey bozuk görünmez: istemci Connected olduğunu bildirir, hiçbir hata oluşmaz ve mesaj olayları sadece gelmeyi keser. Grafiğiniz sessizce eskir.

Alışılmış çözüm, kendi abonelik listenizi tutup OnConnect içinden yeniden oynatmaktır. Bu da her sembolü, her kanalı ve istediğiniz her akışı hatırlamak, ayrıca kod tabanının başka bir yerinde her abone olup abonelikten çıktığınızda bu listeyi güncellemeyi hatırlamak demektir. Stratejinizle hiçbir ilgisi olmayan bir defter tutma işidir.

Otomatik yeniden aboneliği açmak

API istemcileri neye abone olduğunuzu zaten bilir, çünkü abone olurken onları kullandınız. 2026.7 ile bu listeyi saklayabilir ve yeniden bağlanmanın ardından kendileri yeniden oynatabilirler. Borsa seçenekleri nesnesi üzerinde tek bir Boolean değeridir, adı Resubscribe.

Bugün çoğu alım satım uygulamasında bulunan elle yazılmış sürüm ve onun yerine geçen şey aşağıda:

uses
  sgcWebSocket, sgcWebSocket_API_Binance;

// Before: keep your own list and replay it on every reconnect.
procedure TForm1.OnBinanceConnect(Connection: TsgcWSConnection);
begin
  sgcWSAPI_Binance1.SubscribeTrades('btcusdt');
  sgcWSAPI_Binance1.SubscribeTicker('btcusdt');
  sgcWSAPI_Binance1.SubscribeTrades('ethusdt');
  // ... and every other symbol you had open, in the right order.
end;

// After: the API client replays them for you.
sgcWSAPI_Binance1.Binance.Resubscribe := True;

Resubscribe etkinken istemci, siz abonelik yaptıkça her aboneliği kaydeder ve WatchDog soketi geri getirdikten sonra bunları yeni oturumda tekrar gönderir. Abonelikten çıkmak kaydı siler, böylece bilerek kapattığınız bir akış, bir sonraki yeniden bağlanmadan sonra ölümden geri dönmez.

Bu özellik WatchDog'un yerini almaz, onunla birlikte çalışır. WatchDog taşıma katmanını geri yükler, Resubscribe ise onun üzerinde oturumu geri yükler:

uses
  sgcWebSocket, sgcWebSocket_API_Kraken;

begin
  sgcWebSocketClient1.WatchDog.Enabled := True;
  sgcWebSocketClient1.WatchDog.Timeout := 5;   // retry the socket every 5 seconds

  sgcWSAPI_Kraken1.Client := sgcWebSocketClient1;
  sgcWSAPI_Kraken1.Kraken.Resubscribe := True; // and restore the streams on top

  sgcWebSocketClient1.Active := True;
  sgcWSAPI_Kraken1.SubscribeTrade(['XBT/USD', 'ETH/USD']);
end;

Varsayılan değer False. Hâlihazırda elle yeniden abone olan mevcut uygulamalar, siz kendi kodunuzu silip bayrağı ayarlayana kadar, yinelenen abonelikler olmadan tam olarak eskisi gibi çalışmaya devam eder.

Hangi borsalar

Resubscribe, her borsa istemcisinin seçenekler nesnesi üzerindedir. Binance, Bitfinex, Bitget, BitMEX, Bitstamp, Bybit, CEX, CEX Plus, Coinbase, Crypto.com, Deribit, Gate.io, Huobi, Kraken, KuCoin, MEXC ve OKX borsalarında, ayrıca oturum tabanlı XTB akış beslemesinde kullanılabilir. Özellik her zaman aynı şekilde yazılır, dolayısıyla forma bıraktığınız bileşene göre satır Coinbase.Resubscribe, Bybit.Resubscribe, OKX.Resubscribe ve benzeri şekilde okunur.

IG ve diğer aracı kurumlar tarafından kullanılan Lightstreamer istemcisi aynı şeyi dahili olarak yapar. Bir oturum yeniden bağlandıktan sonra sunucunun önceki aboneliklere dair hiçbir kaydı olmaz, dolayısıyla istemci onları siz istemeden yerel koleksiyonundan yeniden oynatır.

İstemci tarafından hız sınırları

Bir alım satım uygulamasının diğer yarısı REST tarafıdır: emir verme, emir iptal etme, bakiyeleri yükleme, sembol listesini yükleme. Her borsa bu uç noktalar için bir istek bütçesi yayınlar, genellikle IP başına ya da anahtar başına dakikada belirli sayıda istek ya da ağırlık. Bunu aşarsanız 429 alırsınız ve aşmaya devam ederseniz geçici bir yasak alırsınız, ki bu çok daha kötü bir gündür.

2026.7, TsgcHTTPAPI_client sınıfına istemci taraflı bir hız sınırlayıcı ekliyor, böylece hazır gelen her REST istemcisi bunu miras alıyor. Kayan bir penceredir: herhangi bir IntervalMs penceresinde en fazla MaxRequests istek. Bunu borsanın yayınladığı kurallara göre yapılandırırsınız, çünkü önemli olan tek sınır borsanın sınırıdır:

uses
  sgcHTTP_API, sgcHTTP_API_Binance;

var
  oBinance: TsgcHTTP_API_Binance_Rest;
begin
  oBinance := TsgcHTTP_API_Binance_Rest.Create(nil);
  try
    oBinance.RateLimit.Enabled     := True;
    oBinance.RateLimit.IntervalMs  := 60000;   // one minute window
    oBinance.RateLimit.MaxRequests := 1000;    // stay under the published budget
    oBinance.RateLimit.Behavior    := rlbWait; // default

    // Every request through this component now takes a slot first.
    oBinance.GetAccountInformation;
  finally
    oBinance.Free;
  end;
end;

Kendinizi kısıtlatmanın klasik yolu, başlangıçtaki ani istek patlamasıdır. Uygulama açılır ve ilk saniye içinde sembol listesini, bakiyeleri, açık emirleri ve kırk enstrüman için son mumları yüklemek üzere dağılır. Bunda mantıksız hiçbir şey yoktur, borsa yine de bunu bir saniyede kırk istek olarak sayar. Sınırlayıcı, başlatma kodunuza Sleep çağrıları serpiştirmenize gerek kalmadan tam da bu trafik biçimini yumuşatır.

Sınırlayıcı tembel biçimde oluşturulur. RateLimit özelliğine hiç dokunmazsanız hiçbir nesne ayrılmaz ve istek yolu bayt bayt eskisiyle aynı kalır, dolayısıyla kullanmadığınızda hiçbir bedeli olmaz.

Bekle ya da reddet

Geçerli pencerenin bütçesi tükendiğinde, bir sonraki çağrıya ne olacağını siz seçersiniz. Bu Behavior özelliğidir ve bir ayar düğmesinden çok gerçek bir karardır.

Varsayılan olan rlbWait, bir yer açılana kadar çağrıyı bloke eder ve sonra gönderir. Geçmiş verisi yükleyen ya da pozisyonları mutabakatlayan bir arka plan iş parçacığında istediğiniz budur. İş biraz daha uzun sürer ve hepsi tamamlanır.

rlbReject ise hemen EsgcHTTPRateLimit hatası fırlatır ve hiçbir şey göndermez. Geç kalmış bir isteğin hiç istek göndermemekten daha kötü olduğu durumlarda istediğiniz budur. Göndermeye karar verdikten üç saniye sonra varan bir emir, artık istemediğiniz bir emir olabilir ve onu hareket hâlindeki bir piyasaya fırlatmak, sesli biçimde başarısız olmaktan daha kötüdür:

uses
  SysUtils, sgcHTTP_API, sgcHTTP_API_Binance;

begin
  oBinance.RateLimit.Enabled     := True;
  oBinance.RateLimit.IntervalMs  := 1000;
  oBinance.RateLimit.MaxRequests := 10;
  oBinance.RateLimit.Behavior    := rlbReject;

  try
    oBinance.NewOrder('BTCUSDT', 'BUY', 'LIMIT', ...);
  except
    on E: EsgcHTTPRateLimit do
      // Budget exhausted. Drop the order rather than send it stale.
      LogWarning('rate limit hit, order not sent: ' + E.Message);
  end;
end;

Yaygın bir kurulum, iki bileşenle her ikisini birden kullanmaktır: toplu yükleme yapan bileşende rlbWait, emir veren bileşende rlbReject, her biri kendi bütçesiyle.

Bu, sunucu taraflı hız sınırlayıcı değildir

Adlar birbirine yakın olduğu için açıkça belirtmeye değer. sgcWebSockets 2026.5, sunucu taraflı bir sınırlayıcı olan TsgcWSRateLimiter bileşenini getirmişti: gelen bir bağlantının size ne kadar gönderebileceğini sınırlayarak sizin sunucunuzu sizin istemcilerinizden korur. Bu yazıdaki sınırlayıcı ters yöne bakar. Uygulamanızın bir borsaya ne gönderdiğini sınırlayarak sizi başkasının sınırlarından koruyan istemci taraflı bir sınırlayıcıdır. Bunlar birbirinden bağımsızdır ve hem sunucu hem de borsa tüketicisi olan bir uygulama ikisini de gönül rahatlığıyla kullanabilir.

Yalnızca kripto değil

RateLimit, temel HTTP API istemcisi üzerinde yaşar, dolayısıyla yalnızca borsalar değil, kütüphanedeki hazır gelen her REST istemcisi tarafından miras alınır. AI istemcilerinin tam olarak aynı türden istek sınırları vardır, dolayısıyla OpenAI, Anthropic ve Gemini de bunu alır, Stripe ve diğer API entegrasyonları da öyle. Özellik aynı yerde ve aynı dört ayarla bulunur:

uses
  sgcHTTP_API, sgcHTTP_API_OpenAI;

begin
  oOpenAI.RateLimit.Enabled     := True;
  oOpenAI.RateLimit.IntervalMs  := 60000;
  oOpenAI.RateLimit.MaxRequests := 500;    // your tier's requests per minute
  oOpenAI.RateLimit.Behavior    := rlbWait;
end;

Hesabınız dakikada düşük istek tavanı olan bir katmandaysa, paralel bir toplu işin bu tavanı aşmasını engellemenin en ucuz yolu budur.

Kullanılabilirlik

Otomatik yeniden abonelik ve istemci taraflı hız sınırlayıcı, sgcWebSockets 2026.7 sürümünde Delphi 7 ile 13 arası ve C++Builder için, Win32/Win64, Linux64, macOS, Android ve iOS platformlarında kullanılabilir. Her ikisi de varsayılan olarak kapalıdır, dolayısıyla yükseltme doğrudan yerine oturur.

Aktif aboneliği olan müşteriler yeni yapıyı müşteri alanından indirebilir. Deneme kullanıcıları güncellenmiş kurulum dosyasını esegece.com/products/websockets/download adresinden alabilir.

Sorularınız, geri bildirimleriniz ya da bunu alım satım uygulamanıza bağlamak için yardıma mı ihtiyacınız var? Bize ulaşın, yanıtı kodu yazan kişilerden alacaksınız.