Reactor Rxjava Stream 比較

原文

翻譯上面的原文,因?yàn)樽罱谟肦eactor, 所以想知道什么時(shí)候用什么,why? 可能會(huì)有多篇和實(shí)例,這是第一篇

多個(gè)Reactive 框架Reactor /Rxjava (1/2), 還有java8的stream, 來(lái)比較下,從8個(gè)方面

1. Composable

2. Lazy

3. Reuseable

4.Asynchronous

5.Cacheable

6.Pull or Push

7.Backpressure

8.Operator fusion

參與比較的工具有:

CompletableFucture, Stream, Optional, Observable(Rxjava1), Observable(Rxjava2), Flowable(Rxjava2), Flux(Reactor)

1. Composable: 組合性, 能否function編程

CompletableFucture, 有一組then*()方法,可以組成pipeline,傳遞你nothing或者single value 從stage到stage

Stream,有一組operators來(lái)傳遞N個(gè)value

Optional, 只有map,flatMap,filter少數(shù)幾個(gè)中間方法

Observable, Flux, Flowable, 這點(diǎn)跟stream一樣

2. Lazy, 是否懶加載,推遲執(zhí)行

CompletableFuture, 在對(duì)象創(chuàng)建的時(shí)候被賦予的是已經(jīng)啟動(dòng)的Async的線程,只能通過(guò)它得到結(jié)果,不lazy

Stream, 所有中間操作(返回Stream的)都是lazy,所以trigger操作都是不lazy

Optional, 不lazy, 立即發(fā)生

Observable, Flux, Flowable, lazy, 直到subscriber出現(xiàn)

3. Reusable, 復(fù)用

CompletableFucture, 可以復(fù)用,畢竟只是個(gè)wrapper對(duì)象

Stream,不可以, javadoc:?

一個(gè)stream只能在(一個(gè)中間或終結(jié)操作)執(zhí)行一次,復(fù)用會(huì)拋出IllegalStateException,但是一些stream操作會(huì)返回receiver而不是一個(gè)新的stream對(duì)象,所以很難發(fā)現(xiàn)

Optional, 可以,是immutable, 立即發(fā)生

Observable, Flux, Flowable, 可以從設(shè)計(jì)上復(fù)用,都是從開(kāi)始調(diào)用直到subscriber

4. Asynchronous 異步

CompletableFuture, 本身為了Async而出現(xiàn),代表了一個(gè)work,內(nèi)部通過(guò)ForkJoinPool來(lái)操作Executor,默認(rèn)創(chuàng)建cpu core數(shù)量的線城池,或者double(超頻),可以通過(guò)jvm參數(shù): -Djava.util.concurrent.ForkJoinPool.common.parallelism=? 設(shè)置數(shù)量

Stream,本身不Async, 可以通過(guò)parrallelStream來(lái)多線程

Optional, 不行

Observable, Flux, Flowable, 基于Observer模式的,肯定是Async, 還能通過(guò)Subscirber接口方法onNext onCompleted來(lái)控制, 然后subscribeOn 和observeOn 可以控制 subcription和reception ,類似:

返回:

5. Cacheable , 緩存

reuseable和cacheable的區(qū)別: 假設(shè)pipeline A , re-use 2次, 創(chuàng)建pipeline B = A + [] , C = A + []

如果B 和C 成功,就是可reusable,

如果B 和 C成功, A的每個(gè)stage只被調(diào)用1次,就是cacheable, 必須是reusable 才能cacheable

CompletableFuture,? 跟reusable的一樣,

Stream, 不能cache中間結(jié)果

Optional, 可以,因?yàn)榻Y(jié)果已經(jīng)得到

Observable, Flowable, Flux, 默認(rèn)不是, 可以.cache()方法來(lái)啟用

6. Push, Pull , 是push模式還是pull模式

Stream , Optional是pull的,通過(guò)collect(), get()等方法,pull模式意味著阻塞,同步

CompletableFuture, Flux, Observable, Flowable, 是push的, 意味著非阻塞,異步

7.Backpressure, 背壓(極差的翻譯)

主要是push模式才有, 上游的Push數(shù)量超過(guò)了下游subscriber的處理能力

CompletableFuture, 不需要,只有一個(gè)結(jié)果

Observable(Rxjava1), Flux, Flowable, 處理策略:

Bufferring, 緩存,來(lái)不及處理的放入buffer, onNext()方法(其中Flux默認(rèn)LONG_MAX 大小)

Drop, 扔

use latest, 用最新的

None, 不管

Exception, 扔異常

Observable(Rxjava2), 不解決這個(gè)問(wèn)題,必須使用Flowable來(lái)處理


8. Operator Fusion, 操作符熔斷

是一種多中間階段的代碼優(yōu)化,只有Reactor 和Rxjava2 支持, 舉例:

marco-fusion:

marco-fusion

不是很清楚更具體從其他文章分析

總結(jié)

Stream,CompletableFuture and Optional都是為了解決特別的問(wèn)題而出現(xiàn),不用濫用

Rxjava 和Reactor 也同樣, 在大并發(fā)的情況下,需要測(cè)試使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • 適合閱讀的人群:本文適合對(duì) Spring、Netty 等框架,以及 Java 8 的 Lambda、Stream ...
    編走編想閱讀 51,639評(píng)論 39 116
  • 反應(yīng)式編程(Reactive Programming)這種新的編程范式越來(lái)越受到開(kāi)發(fā)人員的歡迎。在 Java 社區(qū)...
    feiniao123閱讀 6,937評(píng)論 0 6
  • 今天既是我再次參加‘21天寫(xiě)作訓(xùn)練’的日子,也是我繼續(xù)閱讀并學(xué)習(xí)《成為作家》這本書(shū)的日子。以前已經(jīng)寫(xiě)過(guò)了關(guān)于成為作...
    喜水閱讀 386評(píng)論 5 9
  • 隆! 血紅的寒冰風(fēng)暴猶如巨龍般的碾壓下來(lái),而牧塵那緊閉的雙目,也是在此時(shí)陡然睜開(kāi),那一對(duì)黑色眸子中,卻是出奇的并沒(méi)...
    混沌天書(shū)閱讀 278評(píng)論 0 1

友情鏈接更多精彩內(nèi)容