响应式编程基础
什么是响应式编程
响应式编程(Reactive Programming)是一种面向数据流和变化传播的编程范式。它关注的是数据流的异步处理和事件驱动。
核心概念
- 数据流(Stream):数据以流的形式传递,而非一次性返回
- 异步(Asynchronous):操作不会阻塞当前线程
- 非阻塞(Non-blocking):线程不会等待 I/O 操作完成
- 背压(Backpressure):消费者可以控制生产者的数据发送速率
Reactive Streams 规范
Reactive Streams 是 JVM 上响应式编程的标准规范,定义了四个核心接口:
1. Publisher(发布者)
1 2 3
| public interface Publisher<T> { void subscribe(Subscriber<? super T> s); }
|
2. Subscriber(订阅者)
1 2 3 4 5 6
| public interface Subscriber<T> { void onSubscribe(Subscription s); void onNext(T t); void onError(Throwable t); void onComplete(); }
|
3. Subscription(订阅关系)
1 2 3 4
| public interface Subscription { void request(long n); void cancel(); }
|
- 表示 Publisher 和 Subscriber 之间的订阅关系
- 背压的核心:通过
request(n) 控制数据流速
4. Processor(处理器)
1 2
| public interface Processor<T, R> extends Subscriber<T>, Publisher<R> { }
|
数据流生命周期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ┌──────────────┐ subscribe() ┌──────────────┐ │ Publisher │ ──────────────────▶ │ Subscriber │ └──────────────┘ └──────────────┘ │ │ │ onSubscribe(subscription) │ │ ◀────────────────────────────────── │ │ │ │ request(n) │ │ ◀────────────────────────────────── │ │ │ │ onNext(data) × n │ │ ──────────────────────────────────▶ │ │ │ │ onComplete() / onError() │ │ ──────────────────────────────────▶ │ ▼ ▼
|
背压(Backpressure)
背压是响应式编程中的重要概念,用于解决生产者速度快于消费者的问题。
背压策略
| 策略 |
说明 |
| Buffer |
缓存所有元素,可能导致内存溢出 |
| Drop |
丢弃无法处理的元素 |
| Latest |
只保留最新的元素 |
| Error |
抛出异常 |
示例
1 2 3 4 5 6 7
| Flux.range(1, 1000) .onBackpressureBuffer(100) .onBackpressureDrop() .onBackpressureLatest() .subscribe(data -> { });
|
响应式编程的优势
- 资源利用率高:少量线程处理大量请求
- 响应性好:不会因为某个操作阻塞整个系统
- 弹性:更容易处理错误和故障
- 可组合性:操作符可以灵活组合
响应式编程的挑战
- 调试困难:异步代码的堆栈跟踪不直观
- 学习曲线:需要转变思维方式
- 生态限制:需要整个调用链都是响应式的
相关链接
- 上一篇:Webflux简介
- 下一篇:Reactor核心API