Backpressure
- Java kursu
- Uzman
- Ders 22/46
- 5 dk
Backpressure ile akış denetimini öğrenirsin.
Backpressure
Backpressure (geri basınç), tüketicinin üreticiye ne kadar veri istediğini bildirmesidir. Hızlı bir Publisher yavaş bir Subscriber'ı boğmasın diye Subscriber request(n) ile yalnızca n öğe ister.
Bu sayede Publisher, abonenin hazır olmadan öğe göndermez; bellek şişmesi önlenir. Backpressure, Reactive Streams'in en önemli özelliğidir; klasik gözlemci (observer) deseninden temel farkı budur. Talep olmadan iletim, sözleşmeye göre yasaktır.
Talep stratejileri
Yaygın iki talep stratejisi vardır. Tek tek: her onNext sonrası request(1) çağrılır; bu, yavaş işleme için uygundur. Sınırsız: request(Long.MAX_VALUE) ile tüm öğeler istenir; bu, geri basıncı devre dışı bırakır.
Örnek: bir günlük abonesi her satırı tek tek işliyorsa tek tek strateji seçilir. Toplu işleyen bir abone ise daha büyük isteklerle performansı artırabilir. Doğru strateji, abonenin işleme hızına ve Publisher'ın üretim hızına bağlıdır.
Uygulama Talep ile alınan öğe sayısını yazdır
Bir LimitPublisher sınıfı tanımla: Publisher<Integer> arayüzünü uygulasın. subscribe içindeki request(long n) yöntemi bir döngü ile n kez s.onNext(i) çağrısı yapsın, sonra s.onComplete() çağrısı yapsın. main içinde anonim Subscriber; onSubscribe s.request(2) yapsın, onNext count++ yapsın, onComplete System.out.println(count) ile sayıyı yazdırsın.
Başlangıç kodu
// LimitPublisher sınıfını tanımla
// request ile sınırla
// onComplete içinde sayıyı yazdırÖrnek çözüm
import java.util.concurrent.Flow.*;
class LimitPublisher implements Publisher<Integer> {
public void subscribe(Subscriber<? super Integer> s) {
s.onSubscribe(new Subscription() {
public void request(long n) {
for (int i = 0; i < n; i++) s.onNext(i);
s.onComplete();
}
public void cancel() { }
});
}
}
public class BackpressureDemo {
public static void main(String[] args) {
new LimitPublisher().subscribe(new Subscriber<Integer>() {
int count;
public void onSubscribe(Subscription s) { s.request(2); }
public void onNext(Integer v) { count++; }
public void onError(Throwable t) { }
public void onComplete() { System.out.println(count); }
});
}
}Beklenen çıktı
2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Backpressure hangi yöntemle kontrol edilir?
- onNext
- onComplete
- request Doğru cevap
- subscribe
Açıklama: request(n) ile talep miktarı bildirilir.
2 Backpressure kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
request |
Talep miktarı |
Subscriber |
Talebi belirler |
Publisher |
Talebe uyar |
Long.MAX_VALUE |
Sınırsız talep |
3 request çağrısını tamamla
sub.____(2);
sub.request(2);
Açıklama: request(2) iki öğe talep eder.