响应式编程之RxJava VS Reactor

目前市场上比较流行的有几种,RxJava,Akka,Vert.x,Reactor。最常使用的两种框架,并且实现了响应式编程规范的是RxJava和Reactor。

两者之间有什么区别呢?

API

Flowable和FluxAPI很相似都支持,ReactiveX常见的那些操作符。map,filter,flatmap等等,具体操作符列表:http://reactivex.io/documentation/operators.html

在Java版本上:

  • RxJava2.x必须至此Java 6,因为它Rxjava在安卓中用的很多
  • Reactor则至少要求Java 8. 其内部利用了很多新版Java的特性。并且还可以方便的转换为:CompletableFuture,java.util.stream.Stream,Optional

Reactor胜出一票

Checked exceptions

  • Reactor使用Java标准的functional类型,如java.util.function.Function
  • RxJava使用自己设计的函数类型。io.reactivex.functions.Function
    对于JDK自带的Function,checked exception则不能编译通过,效果如下图。使用Reactor的时候必须要处理这些异常。

这一点设计的好坏上,看用户习惯,但RxJava体验上可能更好一些,用户选择是否要捕获异常,Reactor强制捕获异常。

RxJava胜出0.5票

类型

Reactor只支持,Mono和Flux类型,而RxJava支持Completable,MayBe,Single,Observable,Flowable。

其中Mono和MayBe对应,Flowable和Flux对应。Reactor不支持其它的类型,也就意味着在一些场景下Reactor并不能很好的支持。

  • 难道Mono一定要发射一个值?能不能不发射值
  • 能不能不想要背压的支持?

在各种常见的处理上,RxJava处理的歧义比Reactor更少一些,并且支持更多的类型。

RxJava胜出一票

Testing

在多线程程序测试上,我们可能想要使用一个虚拟的线程调度器来模拟时钟。RxJava提供了TestScheduler,但是可能会出现多次传递TestScheduler的场景,这个时候代码就更容易陷入一团乱。

对于Reactor则是使用了withVirtualTime,底层会自动的进行替换,提升代码的可读性。

Reactor胜出0.5票

Debugging

Reactor添加了一个很好的调试特性:

Hooks.onOperatorDebug();

在应用之前加上这一行代码,可以跟踪数据流的流动,看一个例子。

public class FluxDemo {
    public static void main(String[] args) {

        Hooks.onOperatorDebug();

        Mono<Long> totalTxtSize = Flux
                .just("/tmp", "/home", "/404")
                .map(File::new)
                .concatMap(file -> Flux.just(file.listFiles()))
                .filter(File::isFile)
                .filter(file -> file.getName().endsWith(".txt"))
                .map(File::length)
                .reduce(0L, Math::addExact);

        totalTxtSize.subscribe(System.out::println);
    }
}

不加Hooks调试。

加上Hooks调试:

响应式编程在调试的时候增加了一定的难度,而Reactor带来的特性一定程度上减轻了困难。

Reactor胜出一票

Spring支持

Reactor本身是Spring开发人员弄出来的东西,可以与Spring无缝集成,当前Spring新推出的Spring Webflux更是基于Reactor。

作为Java开发人员,Spring可以说是每日都要去使用的东西,Reactor都得到了官方的支持,为什么要使用RxJava呢?

Reactor胜出一票

Android开发

RxJava在安卓开发者中非常的流行,优雅的解决了两个问题,并且现在有RxAndroid的库可以使用:

  • 避免了UI的事件回调地狱,将用户UI事件建模为事件流
  • 容易的切换线程,避免了IO线程运行在UI线程上

目前安卓开发者只能选择RxJava,并且RxJava在Android上已经运行的很稳定。

RxJava胜出一票

成熟度

RxJava目前相比与Reactor更加成熟并且得到市场的认可,参考安卓,其目前被使用的时间更久,关于RxJava的书籍更多,并且也有很多的响应式框架是基于RxJava来做的。

成熟度上目前RxJava胜出一票

总结

两者不相上下

  • 如果是Web开发,可以考虑使用Reactor,毕竟Spring的亲儿子,而且Reactor使用了最新版的一些Java特性,效率上,安全性上,稍微好一点。
  • 如果是Android开发,那么选择RxJava,因为RxJava对Android的支持一直都很好
  • 如果现在已经在使用两种中的其一了,那么继续使用,无需更换

引用