CodeWalk

RxJava与Reactor响应式框架的对比

作者:孤独的心 · 2026-05-30 12:55

对比分析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:flatMap(内部订阅顺序不确定)/ concatMap(保持顺序)/ flatMapSequential
    • RxJava:flatMap / concatMap / switchMap

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:同上
  • 热数据流(Hot):订阅者共享数据
    • Reactor:Sinks.many()/ConnectableFluxconnect()
    • RxJava:Subject/ConnectableFlowableconnect()

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