审校 | 孙淑娟
早在上世纪60年代, IT领域就首次出现了“响应式编程(reactive programming,Rx)”一词。它在维基百科中的定义为:在计算机中,处理数据流和传递变更的一种声明式编程方法。这种范式允许用户轻松地指定静态(如,数组)或动态(如,事件发射器)数据流,以及表明相关执行模型内部存在的、已推断出的依赖关系,进而允许自动传递数据流的变更。在Rx编程中,各种数据流由同一个组件生成。各个Rx库提供了底层的结构,并将这些变更传递给已注册的、可接受此类数据变更的其他组件处。
关于响应式编程
总地说来,响应式编程是各种observable、observer和scheduler的结合。下面,我们将对这些术语进行深入解释。
Observable
数据可以通过一个线程被传输到另一个线程,并存储在observable中。简单地说,observable是一种数据流。根据具体设置的不同,数据可以被定期发送,或者在其生命周期内仅发送一次。
一些操作符(operator)可以帮助observer(我们会在下一部分详细介绍到)发出特定的数据,以响应各种事件。您可以暂且把observable视为提供者(supplier)。它们不但会处理数据,而且能够将其发送到系统的其余部分。
Observers
Observer可以被理解为是消费者(consumer)。它们使用之前已注册的observable,发送数据流。
Schedulers
简而言之,在异步编程中,它们轻松地实现了线程管理。scheduler能够指示observable和observer使用哪些线程。
什么时候适合使用响应式编程?
通常,我们在处理异步数据流时,响应式编程是一种流行的选择。毕竟用例中的微小变化也可能成为我们决策的决定性因素。以下便是一些在现实世界中使用响应式编程的示例:
使用响应式编程开发移动应用程序
由于移动设备在性能上不足以处理繁重的任务,因此我们经常需要在执行期间或任务之后,根据后台线程来更新主线程上的用户界面。对此,我们需要在服务器上执行繁重的工作和复杂的计算。可见,对于此类网络通讯活动的异步工作需求,响应式编程正好可以发挥作用。
在Netflix API中与RxJava一起使用响应式编程
为了减少网络中的常规交互,我们需要使用RxJava服务器端的并发机制,在Netflix API中进行响应式编程。由于来自某个设备的每一个网络请求,都会自动与其他网络请求并行处理,因此如果服务器端无法支持并发执行的话,那么单个“重”的客户端请求,很可能都不如几个“轻”的客户端请求的被处理速度。而且,即使我们已将网络延迟考虑在内,如果一个已压缩的“重”请求服务器端,在处理中没有达到相同程度的并行处理,那么它就可能会比多个“轻”的请求要慢得多。
外部调用服务
由于如今许多后端服务都是RESTful类型(即,它们使用的是HTTP),因此底层协议可能会造成阻塞,以及出现同步调用外部服务的情况。在进行服务开发的时候,我们不但需要经常联络和调用其他的服务,而且要根据第一次调用的结果,按需调用额外更多的服务。因此,在面对众多I/O时,我们需要在发出下一个请求之前,等待前一个调用的完成。而这往往会导致我们的客户,因为丧失服务响应等待的耐心,而放弃后续的使用。
因此,我们有必要优化外部服务的调用,特别是那些针对跨不同调用之间复杂依赖关系的编排。响应式编程能够保障此类活动的背后,在逻辑上的“可组合性”,以便调用服务的开发人员能够更容易地编写相关的代码。
高并发消息的消费者
一种典型的企业用例往往发生在有大量并发消息处理的消费者处,尤其是在那些高度同步的情况下。而响应式框架的优势就在于:通过测量微基准(microbenchmark),实现了每秒都能够在JVM上处理大量的消息。
整合响应式编程
在线游戏、社交媒体和多人聊天室,都是持续使用音频和视频的应用程序(主要被用于流媒体)。而当涉及到特定类型的高负载、或多用户应用时,响应式编程显然是一个优雅的解决方案。不过,响应式技术的引入也可能会增加不必要的复杂性,甚至会给应用程序的性能带来影响。因此,我们需要通过如下三个简单步骤,合理地将响应式程序集成到目标应用中:
第1步:创建一个Data-Emitting类型的Observable
为了让数据库在Observable下,发送字符串型的数据。我们可以通过提供不同的参数,让just()函数能够逐一发送数据。
第2步:创建一个Data-Consuming类型的Observer
前续代码片段中的observer能够使用数据库observable生成的数据。它不但可以接收数据,而且能够处理数据,甚至还可以处理各种错误。
第3步:调节并发性
最后,我们来定义并发的scheduler。程序不但需要通过subscribeOn(Schedulers.newThread()),在后台线程中告知数据库observable去运行;而且需要通过observeOn(AndroidSchedulers.mainThread())在主线程上告知observer去运行。这便是最基本的响应式编程代码。
总结
在上文中我们探讨了响应模式的趋势,以及如何将响应式编程集成到应用程序的步骤。就Java虚拟机而言,目前已有多个响应式代码库或框架正在被研发。它们不但功能全面,而且具有广泛的兼容性。
译者介绍
陈峻 (Julian Chen),51CTO社区编辑,具有十多年的IT项目实施经验,善于对内外部资源与风险实施管控,专注传播网络与信息安全知识与经验;持续以博文、专题和译文等形式,分享前沿技术与新知;经常以线上、线下等方式,开展信息安全类培训与授课。
原文Reactive Programming:The Steps To Integrate It Into Your Application,作者:Gurpreet Singh