RxJava VS Reactor

随着web应用的发展,人们提出了响应式的概念,在应用高负载,高并发的时候仍然有良好的用户体验,能够尽可能的实时返回数据。

The need for a non-blocking web stack to handle concurrency with a small number of threads and scale with fewer hardware resources. Servlet 3.1 did provide an API for non-blocking I/O.

意思是使用更少的线程数和更少的硬件资源来处理大量的并发请求。

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

两者之间有什么区别呢?

API -> Reactor

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

在Java版本上:

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

Reactor胜出一票

Checked exceptions -> RxJava

  • Reactor使用Java标准的functional类型,如java.util.function.Function
  • RxJava使用自己设计的函数类型。io.reactivex.functions.Function

对于JDK自带的Function,checked exception则不能编译通过,效果如下图。使用Reactor的时候必须要处理这些异常。

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

image-20200113135725803
image-20200113135702010

RxJava胜出0.5票

类型 -> RxJava

Reactor只支持,Mono和Flux类型,而RxJava支持CompletableMayBeSingleObservableFlowable

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

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

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

RxJava胜出一票

Testing -> Reactor

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

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

Reactor胜出0.5票

Debugging -> Reactor

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调试。

image-20200113141212664

加上Hooks调试:

image-20200113141257216

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

Reactor胜出一票

Spring支持 -> Reactor

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

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

Reactor胜出一票

Android开发 -> RxJava

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

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

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

RxJava胜出一票

成熟度 -> RxJava

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

成熟度上目前RxJava胜出一票

最后

两者不相上下

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

参考:

https://www.reactivesystems.eu/2017/01/31/things-i-wish-i-knew-when-i-started-building-reactive-systems.html

https://www.javacodegeeks.com/2018/08/frameworks-toolkits-make-java-reactive-rxjava-spring-reactor-akka-vert-x-overview.html

https://www.nurkiewicz.com/2019/02/rxjava-vs-reactor.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容