前言
Reactive Streams 是一种用于异步流处理的规范,旨在提供一种标准化的方式来处理数据流,特别是当数据流的速度和数量不可预测时。它定义了一组接口和规则,以确保生产者和消费者之间的交互是高效且可控制的。
Reactive Streams规范(特点)
- 背压 (Backpressure): 消费者可以控制从生产者接收数据的速度,防止生产者发送过快导致消费者无法处理。(按量消费)建立一个数据缓冲区,我能消费多少我拿多少。
- 非阻塞 (Non-blocking): 处理数据时不会阻塞线程,提高系统的响应性和吞吐量。
- 异步 (Asynchronous): 数据流的处理是全异步的,适合高并发场景。
- 解耦 (Decoupling): 生产者和消费者之间通过接口解耦,提高系统的灵活性和可维护性。
数据管道
-
Publisher:发布者,负责产生数据流。
-
Subscriber:订阅者,负责消费数据流。
-
Subscription:订阅关系,连接 Publisher 和 Subscriber的对象,用于控制数据流的速度。
-
Processor:处理器,既是 Subscriber 又是 Publisher,可以对数据流进行中间处理。
java.util.concurrent.Flow;包路径,引用接口调用
publisher发布的所有数据存在了它的buffer区
public class SimpleReactiveStreamsExample {
public static void main(String[] args) {
// 创建一个 Publisher
Publisher<Integer> publisher = new Publisher<Integer>() {
@Override
public void subscribe(Subscriber<? super Integer> subscriber) {
subscriber.onSubscribe(new Subscription() {
@Override
public void request(long n) {
for (int i = 0; i < n; i++) {
subscriber.onNext(i);
}
subscriber.onComplete();
}
@Override
public void cancel() {
// 取消订阅
}
});
}
};
// 创建一个 Subscriber
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
private Subscription subscription;
@Override //在订阅时 在某事件发生时,执行这个回调
public void onSubscribe(Subscription subscription) {
this.subscription = subscription;
// 请求 5 个数据项,相当于建立管道,刚建立完找上游要数据 第一次发五个数据
subscription.request(5);
}
@Override //在下一个元素到达时 执行这个回调 接受都新数据
public void onNext(Integer item) {
System.out.println("Received: " + item);
// 在消耗第一次五个数据后 在此请求 5 个数据项
subscription.request(5);
}
@Override //在错误发生时
public void onError(Throwable throwable) {
System.err.println("Error: " + throwable.getMessage());
}
@Override //在完成时
public void onComplete() {
System.out.println("Completed");
}
};
// 订阅
publisher.subscribe(subscriber);
}
}
响应式编程是什么
1、底层:基于数据缓冲队列+消息驱动模型+异步回调机制。
2、编码:流式编程+链式调用+声明式API。
3、效果:优雅全异步+消息实时处理+高吞吐量 +占用少量资源。
响应式的核心:消息传递
整个消息的传递靠消息队列,需要保证实时性的消息传递。
响应式流就是利用消息驱动,最终构成一个弹性的和回弹性的,实现一个及时响应性。
解决痛点
使高并发三宝:【缓存、异步、队排好】,无需手动控制,现全都自动控制。
总结
Reactive Streams 提供了一种强大的机制来处理异步数据流,特别适用于高并发和实时数据处理的场景。