RxJava VS Reactor

隨著web應(yīng)用的發(fā)展寸痢,人們提出了響應(yīng)式的概念痴柔,在應(yīng)用高負(fù)載隧饼,高并發(fā)的時候仍然有良好的用戶體驗(yàn)硝枉,能夠盡可能的實(shí)時返回數(shù)據(jù)。

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.

意思是使用更少的線程數(shù)和更少的硬件資源來處理大量的并發(fā)請求。

目前市場上比較流行的有幾種,RxJava,Akka胡桃,Vert.x,Reactor磕潮。最常使用的兩種框架翠胰,并且實(shí)現(xiàn)了響應(yīng)式編程規(guī)范的是RxJava和Reactor。

兩者之間有什么區(qū)別呢自脯?

API -> Reactor

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

在Java版本上:

  • RxJava2.x必須至此Java 6锻狗,因?yàn)樗黂xjava在安卓中用的很多
  • Reactor則至少要求Java 8. 其內(nèi)部利用了很多新版Java的特性。并且還可以方便的轉(zhuǎn)換為:CompletableFuture焕参,java.util.stream.Stream轻纪,Optional

Reactor勝出一票

Checked exceptions -> RxJava

  • Reactor使用Java標(biāo)準(zhǔn)的functional類型,如java.util.function.Function
  • RxJava使用自己設(shè)計的函數(shù)類型叠纷。io.reactivex.functions.Function

對于JDK自帶的Function刻帚,checked exception則不能編譯通過,效果如下圖涩嚣。使用Reactor的時候必須要處理這些異常崇众。

這一點(diǎn)設(shè)計的好壞上,看用戶習(xí)慣缓艳,但RxJava體驗(yàn)上可能更好一些,用戶選擇是否要捕獲異常看峻,Reactor強(qiáng)制捕獲異常阶淘。

image-20200113135725803
image-20200113135702010

RxJava勝出0.5票

類型 -> RxJava

Reactor只支持,Mono和Flux類型互妓,而RxJava支持Completable溪窒,MayBeSingle冯勉,Observable澈蚌,Flowable

其中Mono和MayBe對應(yīng)灼狰,F(xiàn)lowable和Flux對應(yīng)宛瞄。Reactor不支持其它的類型,也就意味著在一些場景下Reactor并不能很好的支持交胚。

  • 難道Mono一定要發(fā)射一個值份汗?能不能不發(fā)射值
  • 能不能不想要背壓的支持盈电?

在各種常見的處理上,RxJava處理的歧義比Reactor更少一些杯活,并且支持更多的類型匆帚。

RxJava勝出一票

Testing -> Reactor

在多線程程序測試上,我們可能想要使用一個虛擬的線程調(diào)度器來模擬時鐘旁钧。RxJava提供了TestScheduler吸重,但是可能會出現(xiàn)多次傳遞TestScheduler的場景,這個時候代碼就更容易陷入一團(tuán)亂歪今。

對于Reactor則是使用了withVirtualTime嚎幸,底層會自動的進(jìn)行替換,提升代碼的可讀性彤委。

Reactor勝出0.5票

Debugging -> Reactor

Reactor添加了一個很好的調(diào)試特性:

Hooks.onOperatorDebug();

在應(yīng)用之前加上這一行代碼鞭铆,可以跟蹤數(shù)據(jù)流的流動,看一個例子焦影。

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調(diào)試车遂。

image-20200113141212664

加上Hooks調(diào)試:

image-20200113141257216

響應(yīng)式編程在調(diào)試的時候增加了一定的難度,而Reactor帶來的特性一定程度上減輕了困難斯辰。

Reactor勝出一票

Spring支持 -> Reactor

Reactor本身是Spring開發(fā)人員弄出來的東西舶担,可以與Spring無縫集成,當(dāng)前Spring新推出的Spring Webflux更是基于Reactor彬呻。

作為Java開發(fā)人員衣陶,Spring可以說是每日都要去使用的東西,Reactor都得到了官方的支持闸氮,為什么要使用RxJava呢剪况?

Reactor勝出一票

Android開發(fā) -> RxJava

RxJava在安卓開發(fā)者中非常的流行,優(yōu)雅的解決了兩個問題蒲跨,并且現(xiàn)在有RxAndroid的庫可以使用:

  • 避免了UI的事件回調(diào)地獄译断,將用戶UI事件建模為事件流
  • 容易的切換線程,避免了IO線程運(yùn)行在UI線程上

目前安卓開發(fā)者只能選擇RxJava或悲,并且RxJava在Android上已經(jīng)運(yùn)行的很穩(wěn)定孙咪。

RxJava勝出一票

成熟度 -> RxJava

RxJava目前相比與Reactor更加成熟并且得到市場的認(rèn)可,參考安卓巡语,其目前被使用的時間更久翎蹈,關(guān)于RxJava的書籍更多,并且也有很多的響應(yīng)式框架是基于RxJava來做的男公。

成熟度上目前RxJava勝出一票

最后

兩者不相上下

  • 如果是Web開發(fā)荤堪,可以考慮使用Reactor,畢竟Spring的親兒子,而且Reactor使用了最新版的一些Java特性逞力,效率上曙寡,安全性上,稍微好一點(diǎn)寇荧。
  • 如果是Android開發(fā)举庶,那么選擇RxJava,因?yàn)镽xJava對Android的支持一直都很好
  • 如果現(xiàn)在已經(jīng)在使用兩種中的其一了揩抡,那么繼續(xù)使用户侥,無需更換

參考:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市峦嗤,隨后出現(xiàn)的幾起案子蕊唐,更是在濱河造成了極大的恐慌,老刑警劉巖烁设,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件替梨,死亡現(xiàn)場離奇詭異,居然都是意外死亡装黑,警方通過查閱死者的電腦和手機(jī)副瀑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恋谭,“玉大人糠睡,你說我怎么就攤上這事【渭眨” “怎么了狈孔?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長材义。 經(jīng)常有香客問我均抽,道長,這世上最難降的妖魔是什么其掂? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任油挥,我火速辦了婚禮,結(jié)果婚禮上清寇,老公的妹妹穿的比我還像新娘喘漏。我一直安慰自己护蝶,他們只是感情好华烟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著持灰,像睡著了一般盔夜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天喂链,我揣著相機(jī)與錄音返十,去河邊找鬼。 笑死椭微,一個胖子當(dāng)著我的面吹牛洞坑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝇率,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼迟杂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了本慕?” 一聲冷哼從身側(cè)響起排拷,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锅尘,沒想到半個月后监氢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藤违,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年浪腐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺弊。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牛欢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淆游,到底是詐尸還是另有隱情傍睹,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布犹菱,位于F島的核電站拾稳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腊脱。R本人自食惡果不足惜访得,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陕凹。 院中可真熱鬧悍抑,春花似錦、人聲如沸杜耙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佑女。三九已至记靡,卻和暖如春谈竿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摸吠。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工空凸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寸痢。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓呀洲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啼止。 傳聞我的和親對象是個殘疾皇子两嘴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容