Reactor Rxjava Stream 比较

原文

翻译上面的原文,因为最近正在用Reactor, 所以想知道什么时候用什么,why? 可能会有多篇和实例,这是第一篇

多个Reactive 框架Reactor /Rxjava (1/2), 还有java8的stream, 来比较下,从8个方面

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来传递N个value

Optional, 只有map,flatMap,filter少数几个中间方法

Observable, Flux, Flowable, 这点跟stream一样

2. Lazy, 是否懒加载,推迟执行

CompletableFuture, 在对象创建的时候被赋予的是已经启动的Async的线程,只能通过它得到结果,不lazy

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

Optional, 不lazy, 立即发生

Observable, Flux, Flowable, lazy, 直到subscriber出现

3. Reusable, 复用

CompletableFucture, 可以复用,毕竟只是个wrapper对象

Stream,不可以, javadoc: 

一个stream只能在(一个中间或终结操作)执行一次,复用会抛出IllegalStateException,但是一些stream操作会返回receiver而不是一个新的stream对象,所以很难发现

Optional, 可以,是immutable, 立即发生

Observable, Flux, Flowable, 可以从设计上复用,都是从开始调用直到subscriber

4. Asynchronous 异步

CompletableFuture, 本身为了Async而出现,代表了一个work,内部通过ForkJoinPool来操作Executor,默认创建cpu core数量的线城池,或者double(超频),可以通过jvm参数: -Djava.util.concurrent.ForkJoinPool.common.parallelism=? 设置数量

Stream,本身不Async, 可以通过parrallelStream来多线程

Optional, 不行

Observable, Flux, Flowable, 基于Observer模式的,肯定是Async, 还能通过Subscirber接口方法onNext onCompleted来控制, 然后subscribeOn 和observeOn 可以控制 subcription和reception ,类似:

返回:

5. Cacheable , 缓存

reuseable和cacheable的区别: 假设pipeline A , re-use 2次, 创建pipeline B = A + [] , C = A + []

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

如果B 和 C成功, A的每个stage只被调用1次,就是cacheable, 必须是reusable 才能cacheable

CompletableFuture,  跟reusable的一样,

Stream, 不能cache中间结果

Optional, 可以,因为结果已经得到

Observable, Flowable, Flux, 默认不是, 可以.cache()方法来启用

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

Stream , Optional是pull的,通过collect(), get()等方法,pull模式意味着阻塞,同步

CompletableFuture, Flux, Observable, Flowable, 是push的, 意味着非阻塞,异步

7.Backpressure, 背压(极差的翻译)

主要是push模式才有, 上游的Push数量超过了下游subscriber的处理能力

CompletableFuture, 不需要,只有一个结果

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

Bufferring, 缓存,来不及处理的放入buffer, onNext()方法(其中Flux默认LONG_MAX 大小)

Drop, 扔

use latest, 用最新的

None, 不管

Exception, 扔异常

Observable(Rxjava2), 不解决这个问题,必须使用Flowable来处理


8. Operator Fusion, 操作符熔断

是一种多中间阶段的代码优化,只有Reactor 和Rxjava2 支持, 举例:

marco-fusion:

marco-fusion

不是很清楚更具体从其他文章分析

总结

Stream,CompletableFuture and Optional都是为了解决特别的问题而出现,不用滥用

Rxjava 和Reactor 也同样, 在大并发的情况下,需要测试使用

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 适合阅读的人群:本文适合对 Spring、Netty 等框架,以及 Java 8 的 Lambda、Stream ...
    编走编想阅读 50,558评论 39 116
  • 反应式编程(Reactive Programming)这种新的编程范式越来越受到开发人员的欢迎。在 Java 社区...
    feiniao123阅读 6,752评论 0 6
  • 今天既是我再次参加‘21天写作训练’的日子,也是我继续阅读并学习《成为作家》这本书的日子。以前已经写过了关于成为作...
    喜水阅读 353评论 5 9
  • 隆! 血红的寒冰风暴犹如巨龙般的碾压下来,而牧尘那紧闭的双目,也是在此时陡然睁开,那一对黑色眸子中,却是出奇的并没...
    混沌天书阅读 264评论 0 1