Java
Backpressure
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.
Örnek çözümü göster
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); }
});
}
}
Kendini test et
-
Backpressure hangi yöntemle kontrol edilir?
- onNext
- onComplete
- request
- subscribe
Cevabı göster
request — request(n) ile talep miktarı bildirilir.
-
Backpressure kavramlarını eşleştir
- request
- Talep miktarı
- Subscriber
- Talebi belirler
- Publisher
- Talebe uyar
- Long.MAX_VALUE
- Sınırsız talep
-
request çağrısını tamamla
sub.____(2);
Cevabı göster
sub.request(2);
Sıradaki ders: Project Reactor Mono