BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

RxJava 2.0发布:支持响应式流规范

| 作者 ,译者 刘嘉洋 关注 0 他的粉丝 发布于 2016年12月7日. 估计阅读时间: 12 分钟 | 都知道硅谷人工智能做的好,你知道 硅谷的运维技术 也值得参考吗?QCon上海带你探索其中的奥义

RxJava团队历时18个月的开发周期后发布了其响应式Java框架的2.0版本。RxJava是ReactiveX库和框架的一部分,用他们的话来说就是“观察者模式、迭代器模式和函数式编程的最完美融合”。项目组发布的“2.0版本的不同之处”是给已经熟悉RxJava 1.x版本的开发者的很好的阅读指南。

RxJava 2.0可以说是RxJava的全新实现。该版本基于响应式流规范,提供了异步数据流处理非阻塞背压、目标运行环境(JVM和JavaScript)以及网络协议的一套标准。

响应式实现由发布者、订阅者、订阅数据流、获取下一个数据流、处理错误以及关闭连接的概念组成。

响应式流规范将作为java.util.concurrent.Flow出现在JDK 9中。以下接口对应于响应式流规范。正如你所看到的,规范并不大,只包含了四个接口:

Spring Framework 5也是响应式的。想要了解其工作方式,请参考Josh Long的Spring Framework 5.0的功能响应式端点

为了解有关RxJava 2.0的更多信息,InfoQ采访了RxJava 2.0的主要贡献者David Karnok

InfoQ:首先恭喜成功发布RxJava 2.0!18个月的艰辛工作,这简直是一个壮举。这个版本什么地方让你最感到骄傲?

David Karnok:谢谢!在某种程度上,我希望它不要开发这么久。在RxJava的原作者Ben Christensen离开的时候我们经历了10个月的停顿,那段时间里Netflix没有一个人推动这个项目的进展。我相信会有很多人同意自我六月份接管这个项目之后,一切变得明朗起来。我很高兴我对于更先进、更高性能的响应式流的研究得到了好的成果,RxJava 2是它最好的答卷。

InfoQ:RxJava 2.0有何不同,它将怎么帮助开发人员?

Karnok:版本1和版本2区别很多,我不能在这里列举所有的不同之处,但用户可以访问我们专门创建的wiki页面了解更多信息。大体来说,我们现在支持标准响应式流规范,在许多地方都显著地缩减了开销,不再允许空值,根据类型或背压支持的不同拆分库并在基本响应类型间进行显式交互操作。

InfoQ:RxJava在什么地方运用最广泛?(比如说IoT、实时数据处理等等)

Karnok:基于我得到的反馈,我发现RxJava在Android社区运用最为广泛。我相信Project Reactor和Akka主导了服务器端。我并没有具体看到过IoT提及或使用RxJava(它需要Java)的具体例子,也许它们使用了一些在其平台上可行的其他响应式库。实时数据处理方面,人们仍然倾向于使用其他解决方法,其中大多数不是真正的响应式,我不知道有什么提供商(也许是Pivotal)正在推动响应式在该领域的发展。

InfoQ:RxJava比起其他环境能给Android提供什么更好的帮助?

Karnok:据我所知,Android非常想“帮助”他们的用户在仅仅使用Android工具,如AsyncTask、Looper/Handler等等的情况下解决异步和并发问题。

不幸的是,其设计和使用体验并不方便,由于Android开发人员往往难以理解或预测其设计方法,他们的使用感并不佳。这很容易造成回调地狱,并造成主线程异步操作的困难。

RxJava的设计(继承于Microsoft的ReactiveX的设计)是面向数据流并正交化的,当进行数据处理的时候就会执行动作。此外,错误处理和报告是流的关键部分。使用AsyncTask,你必须手动解决错误传递模式并取消挂起的任务,但是RxJava却能自动处理这一部分工作。

实际上,有一个流在后台查询这几个服务,在主线程中呈现的结果可以在RxJava(+Retrofit)中用几行进行表示,简单的屏幕旋转操作就可以立即取消服务调用。

这对于Android开发人员来说是巨大的生产力提升,简单的操作就可以帮助他们更好地实现整个响应式编程模式转换所需的复杂的学习曲线。也许到最后,RxJava对于Android会变得至关重要,因为它减少了移动应用程序业务中个体开发人员、创业公司和小公司的“上市时间”。

在我看来,桌面端/服务器端Java并没有可比性。人们启动ExecutorService并等待Future.get(),知道SwingUtilities.invokeLater可以将数据发送回GUI线程,否则Servlet API(每个请求只有一个线程(pre 3.0))会自然地阻塞APIs(数据库、服务调用)。

桌面端/服务器端人员对他们的服务提供的非阻塞设计的性能优势更感兴趣(而并非可以如何简便地编写服务)。然而,与Android开发不同,仅仅使用RxJava是不够的,很多人都迫切希望有完整的框架可以帮助他们实现业务逻辑,因为没有用于非阻塞web服务的“恰当”标准可以代替Servlet API。(确实有Spring (~Boot)和Play,但我并不想现在使用这些新潮的东西。)

InfoQ:HTTP是一种同步协议,当使用微服务的时候可能会造成很大的背压。像Akka和Apache Kafka这样的流平台可以帮助解决这个问题。RxJava 2.0是否也能自动处理背压问题?

Karnok:RxJava 2的Flowable类型实现了响应式流接口和规范,并可以支持背压。然而,Java层面的背压和网络级别的背压大相径庭。对我们来说,背压代表着在不同阶段管道可以传送多少对象,这些对象的类型和大小可能各不相同。而在网络层面上来说,往往处理固定大小的包,缺少先前传送包的确认显示背压。在经典设置中,网络背压在Java层面上显示为阻塞调用,直到所有数据片段都被写入后才会返回。有类似Netty的非阻塞设置,其中阻塞被隐式缓冲取代,并且据我所知,只有单独、非统一和非响应式流的兼容方式可以处理它们(比如说检查canWrite中什么必须周期性地重试)。有库在尝试嫁接RxNetty和一些Spring,它们也取得了不同程度的成功。

InfoQ:你是否认为响应式架构可以处理大量的流量和实时数据?

Karnok:这取决于问题的复杂性。比如说,如果你的任务是计算大数据源中的字符数,那会有更快、更专用于此的方法。如果你的任务是在传入数据流的服务上生成结果,以返回更详细的响应式解决方案,那这个方法就足以解决问题。据我所知,响应式流的大多数库和框架都是为吞吐量而设计的,而不是为延迟而设计的。比如说,在高频率交易中,可预测的延迟非常重要,可以很容易地被Aeron实现,但这不是RxJava主要要解决的问题,因为不可预测延迟。

InfoQ:HTTP/2是否能解决HTTP/1.1中可扩展性的问题?

Karnok:这与RxJava没什么大关系,我个人没有使用过HTTP/2,我仅仅阅读过其规范。通过相同信道的多路复用取得了一定程度上的成功,但是对于显示背压的支持(比如说即使可以通过网络传送,客户端仍然无法处理卷中的数据)还有待解决。我并不清楚所有的技术细节,但我相信Spring Reactive Web确实可以支持HTTP/2传输,它保留了响应式抽象的复杂性,所以你可以在RxJava 2和Reactor 3中表示你的处理管道。

InfoQ:Java 9预计将实现一些响应式功能。这个规范是否完整?

Karnok:并不。Java 9仅仅会实现4个Java接口,共有7个方法。没有类似于流或类似于Rx的API,也没用任何基于JDK的功能。

InfoQ:如果建立在JDK上是否可以避免使用RxJava?

Karnok:不,我相信对于真正的、成熟的库(如RxJava)的需求会越来越多。一旦工具链达到Java 9,我们肯定会提供适配器,我们也会基于Java 9的功能(VarHandles)调整或重写RxJava 3。

我担心的是,一旦Java 9推出,会有很多个人或是企业尝试写自己的库,“市场”中会充斥着很多低质量的解决方案,更何况例如“RxJava与X有何不同”这样的问题会层出不穷。

我知道这种情况已经发生于响应式流中,有一些库和框架宣传自己是RS,但并不能提供基于它的服务。我(可能我的观点有些偏激)觉得RxJava 2是最优的基于响应式流的解决方案。

InfoQ:RxJava的下一步规划如何?

Karnok:在开发RxJava 2的时候,我们有很优秀的审核人,比如Jake Wharton。不幸的是,尽管我们很努力,开发者预览版和候选版本并没有得到足够的关注,一些小的问题和疏漏还是进入了最终版本。我不期望在未来几个月能解决主要的问题,但我们将持续修复版本1和2,并引入新的操作者来支持我们的用户群。一些附带的库比如RxAndroid提供了RxJava 2的兼容版本,但大多数其他的库还尚未推出兼容版本。有关于RxJava,我计划在六个月内退出RxJava 1(也就是说只修复漏洞),部分原因是因为我一个人维护的负担太重了,鼓励大家转换到RxJava 2。关于RxJava 3还没有具体的计划。有讨论说要根据类型或背压支持的不同拆分库,并制作所谓的运算符-融合元素(可以帮助我们提高性能),响应流规范的标准扩展。

查看英文原文RxJava 2.0 Released with Support for Reactive Streams Specification

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT