响应式编程基础

响应式编程基础

什么是响应式编程

响应式编程(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); // 请求 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) // 缓存100个元素
.onBackpressureDrop() // 丢弃多余元素
.onBackpressureLatest() // 只保留最新
.subscribe(data -> {
// 处理数据
});

响应式编程的优势

  1. 资源利用率高:少量线程处理大量请求
  2. 响应性好:不会因为某个操作阻塞整个系统
  3. 弹性:更容易处理错误和故障
  4. 可组合性:操作符可以灵活组合

响应式编程的挑战

  1. 调试困难:异步代码的堆栈跟踪不直观
  2. 学习曲线:需要转变思维方式
  3. 生态限制:需要整个调用链都是响应式的

相关链接

  • 上一篇:Webflux简介
  • 下一篇:Reactor核心API

响应式编程基础
https://zmmmmy.github.io/2026/01/10/响应式编程基础/
作者
ZhiMy
发布于
2026年1月10日
许可协议