Backpressure
- Türkçe karşılığı
- geri basınç
- Okunuşu
- bekpreşır
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Backpressure, yavaş tüketicinin hızlı üreticiye yavaşlaması için sinyal vermesini sağlayan, verinin işlenebileceğinden hızlı birikmesini önleyen mekanizmadır.
Backpressure nedir?
Backpressure, bir sistemde geriye doğru akan dirençtir: bir parça, sonraki parçanın kaldırabileceğinden daha hızlı veri ürettiğinde yavaş olan parça geri iter ve üreticiye yavaşlamasını ya da durmasını söyler. Bu olmazsa fazlalığın bir yere gitmesi gerekir; genellikle sürekli büyüyen bellek tamponlarına. Bu da artan gecikmeye, bellek yetersizliği (out-of-memory) çökmelerine ya da verinin rastgele bırakılmasına yol açar.
Sistemler aşırı yükü birkaç şekilde yönetir. Tüketici, pull tabanlı akışlarda ve reaktif kütüphanelerde olduğu gibi, veriyi yalnızca hazır olduğunda çekerek akışı denetleyebilir. Sınırlı bir tampon ya da kuyruk, dolduğunda üreticiyi bekletebilir. Ya da sistem, fazla işi örneğin 429 Too Many Requests veya 503 Service Unavailable ile reddederek bilerek yük atabilir (load shedding). Node.js'te iç tampon dolduğunda stream.write() false döndürür ve iyi davranışlı bir üretici daha fazla yazmadan önce drain olayını bekler; pipeline() bunu otomatik yönetir. TCP'de backpressure yerleşiktir; alıcının tamponu dolduğunda akış denetimi göndericinin penceresini küçültür.
Akşam yoğunluğundaki bir restoranı düşünün: aşçılar bunaldıysa host, sipariş fişlerinin birikip her yemeğin gecikmesine izin vermek yerine bir süre yeni misafir almayı durdurur. Backpressure, veri farklı hızlarda çalışan aşamalar arasında hareket ettiği her yerde önemlidir: dosya ve ağ akışları, mesaj kuyruğu tüketicileri, olay akışı boru hatları, loglama sistemleri ve birbirini çağıran mikroservisler gibi.
Backpressure sıklıkla rate limiting ve tamponlama ile karıştırılır. Rate limiting, sunucu ne kadar meşgul olursa olsun istemci başına dakikada 100 istek gibi sabit bir üst sınır uygular; backpressure ise o anda tüketicinin gerçek kapasitesine tepki verir. Tampon yalnızca kısa ani artışları emer ve sınırsız bir tampon bellek bitene kadar sorunu gizler; bu yüzden backpressure farkındalığı olan bir sistemdeki tamponların her zaman bir sınırı vardır. Sonsuza kadar büyüyen bir mesaj kuyruğu, tüketicilerin ölçeklenmesi ya da üreticilerin yavaşlaması gerektiğinin işaretidir.
Önemli noktalar
- Backpressure, yavaş bir tüketicinin hızlı bir üreticiye yavaşlamasını veya durmasını söylemesini sağlar.
- Bu olmadan sınırsız tamponlar, gecikme fırlayana veya bellek bitene kadar büyür.
- Yaygın stratejiler pull tabanlı tüketim, engelleyen sınırlı tamponlar ve load shedding'dir.
- Node.js akışları,
write()falsedöndürdüğünde backpressure sinyali verir. - Rate limiting sabit bir sınırdır; backpressure ise gerçek zamanlı kapasiteye uyum sağlar.
Örnek
import { createReadStream, createWriteStream } from "node:fs";
import { pipeline } from "node:stream/promises";
// pipeline() handles backpressure: reading pauses whenever
// the slower destination's buffer is full, then resumes
await pipeline(createReadStream("huge.log"), createWriteStream("copy.log"));
// Doing it by hand: respect the return value of write()
function writeChunk(stream, chunk, next) {
if (stream.write(chunk)) next(); // buffer has room: keep going
else stream.once("drain", next); // buffer full: wait for "drain"
}Sık sorulan sorular
Backpressure olmazsa ne olur?
Sistemin hızlı ve yavaş parçaları arasında veri bellekte birikir. Birikme büyüdükçe gecikme artar ve sonunda süreç belleği tüketir, çöker ya da veri bırakmaya başlar.
Backpressure ile rate limiting aynı şey midir?
Hayır. Rate limiting isteklere sabit, önceden tanımlı bir sınır uygular; backpressure ise tüketicinin o anda ne kadarını kaldırabildiğine dayanan dinamik bir sinyaldir. Sistemler çoğunlukla ikisini birlikte kullanır.
Mesaj kuyrukları backpressure'ı nasıl yönetir?
Tüketiciler mesajları kendi hızlarında, çoğunlukla bir seferde kaç tane alacaklarına dair bir sınırla çeker; böylece kuyruk ani artışları emer. Consumer lag denen büyüyen birikme, tüketici eklemek ya da üreticileri yavaşlatmak için sinyaldir; sınırlı kuyruklar da dolduklarında yeni mesajları reddedebilir.
İlgili sayfalar
- Mesaj KuyruğuBackend ve API'ler, s. 28Mesaj kuyruğu, bir servisten gelen mesajları bir başkası işlemeye hazır olana kadar saklayan ve sistemin parçalarını eşzamansız çalıştıran bir bileşendir.
- Event StreamingBackend ve API'ler, s. 13Event streaming, olayları birçok uygulamanın gerçek zamanlı okuyup yeniden oynatabildiği ve işleyebildiği sürekli, sıralı, kalıcı bir log olarak kaydetmektir.
- Rate LimitingBackend ve API'ler, s. 37Rate limiting, istemcinin belli bir sürede yapabileceği istek sayısını sınırlayıp sunucuyu ya da API'yi kötüye kullanımdan ve aşırı yükten koruyan tekniktir.
- TCPAğlar, s. 28TCP, bir bağlantı kurup kaybolan verileri yeniden göndererek iki program arasında veriyi güvenilir ve sıralı biçimde ileten temel bir internet protokolüdür.
- Node.jsBackend ve API'ler, s. 31Node.js, JavaScript'i tarayıcı dışında çalıştıran, en çok web sunucuları, API'ler ve komut satırı araçları için kullanılan açık kaynaklı çalışma ortamıdır.
- GecikmeAğlar, s. 9Gecikme, bir istek ile yanıtın başlaması arasında geçen süredir; genellikle milisaniyeyle ölçülür ve bir uygulamanın ne kadar hızlı hissettirdiğini belirler.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin