什么是背压现象
BackPressure,即背压或回压。
Backpressure 是一种现象:当数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure。
案例
import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;
/**
* BackPressure,即背压或回压。
* Backpressure 是一种现象:当数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,
* 这种现象就叫做 Backpressure。
*/
public class BackPressureTest {
public static void main(String[] args) {
SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
Flow.Subscriber<String> subscriber = new Flow.Subscriber<String>() {
private Flow.Subscription subscription;
@Override
public void onSubscribe(Flow.Subscription subscription) {
this.subscription = subscription;
this.subscription.request(1);
}
@Override
public void onNext(String item) {
System.out.println("publisher 发来的消息:" + item);
// 模拟来不及消费现象
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
this.subscription.request(1);
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError");
this.subscription.cancel();
}
@Override
public void onComplete() {
System.out.println("onComplete");
}
};
publisher.subscribe(subscriber);
for (int i = 0; i < 500; i++) {
System.out.println("i----------->" + i);
publisher.submit("hello: " + i);
}
// 这里加休眠,是因为发布者信息发布完了,就会停止。为了让消费者能够及时消费完,故意多停留一会。
// try {
// Thread.sleep(2000);
// } catch (InterruptedException e) {
// throw new RuntimeException(e);
// }
publisher.close();
}
}