RxJava与Reactor响应式框架的对比
对比分析RxJava 3和Reactor两个主流响应式编程框架的异同,包括核心类型、操作符设计、背压策略、以及各自在Java生态中的最佳应用场景。
回答
孤独的心
1. 核心类型对比 | Reactor | RxJava 3 | 说明 | |------|------|------| | Mono | Single/Maybe/Completable | 0-1元素 | | Flux | Observable/Flowable | 0-N元素 | | StepVerifier | TestObserver/TestSubscriber | 测试工具 |
2. 关键差异
背压支持:
- Reactor Flux:默认支持背压(所有操作符遵循Responsive Streams规范)
- RxJava Observable:默认不支持背压(无界)
- RxJava Flowable:支持背压(对应Reactor Flux)
操作符设计:
- 组合操作:
- Reactor:
zip/merge/concat/combineLatest - RxJava:
zip/merge/concat/combineLatest(类似)
- Reactor:
- 转换操作:
- Reactor:
flatMap(内部订阅顺序不确定)/concatMap(保持顺序)/flatMapSequential - RxJava:
flatMap/concatMap/switchMap
- Reactor:
3. 代码示例对比
// Reactor
Flux.just(1, 2, 3)
.flatMap(i -> Mono.just(i * 2).subscribeOn(Schedulers.parallel()))
.subscribe(System.out::println);
// RxJava 3
Flowable.just(1, 2, 3)
.flatMapSingle(i -> Single.just(i * 2).subscribeOn(Schedulers.computation()))
.subscribe(System.out::println);
4. 冷热数据流
- 冷数据流(Cold):每个订阅者独立接收完整数据
- Reactor:
just/from/range默认冷 - RxJava:同上
- Reactor:
- 热数据流(Hot):订阅者共享数据
- Reactor:
Sinks.many()/ConnectableFlux→connect() - RxJava:
Subject/ConnectableFlowable→connect()
- Reactor:
5. 测试对比
// Reactor
StepVerifier.create(Flux.just(1, 2, 3))
.expectNext(1, 2, 3)
.verifyComplete();
// RxJava 3
TestSubscriber<Integer> ts = new TestSubscriber<>();
Flowable.just(1, 2, 3).subscribe(ts);
ts.assertValues(1, 2, 3).assertComplete();
6. 选型建议
- Spring生态:优先Reactor(Spring官方集成)
- Android/非Spring:RxJava更成熟生态(RxAndroid/RxBinding)
- 性能:两者接近,Reactor稍微领先
- 背压:Reactor所有操作符默认支持;RxJava需选择Flowable