序
2005年10月28日,微软新任命的首席架构师Ray Ozzie以邮件的形式给员工发布了一份著名的备忘录,即“互联网服务时代来临”(The Internet Services Disruption)。在这份备忘录中,Ozzie概述了微软、谷歌、亚马逊和Netflix使用Web作为交付服务的主要渠道给世界带来的变化。
从开发人员的角度,Ozzie为大型企业的管理者做了以下重要声明。
复杂性具有杀伤力。它会吞噬开发人员的生命力,让产品难以规划、构建和测试,带来安全性方面的挑战,而且还会给终端用户和管理员带来挫败感。
首先,我们要考虑的是2005年时大型IT企业非常喜欢复杂的技术,如SOAP、WS-*和XML。当时“微服务”这个词还没有出现,没有简单的技术帮助小企业的开发人员管理异步组合复杂服务的复杂性,同时缺少处理失败、延迟、安全性和效率的技术。
对于我在微软的Cloud Programmability团队来说,Ozzie的备忘录是一口能发出振聋发聩声音的警钟,提醒我们要专注于发明一种简单的编程模型,用于构建大规模异步和数据密集型的互联网服务架构。在经历过多次失败之后,我们团队终于明白,通过对同步集合的Iterable/Iterator接口进行二元化(dualizing)处理,可以得到一对表示异步事件流的接口,以及所有熟悉的序列操作符,比如map、filter、scan、zip、groupBy等,它们能够转换和组合异步的数据流,因此,2007年夏天Rx应运而生。在实现过程中,我们意识到需要管理并发和时间,为此扩展了Java executor理念,提供了虚拟时间和协同重新调度的功能。
经过两年密集的编程马拉松,我们团队探索了大量的设计方案以供选择,并在2009年11月18日先推出了Rx.NET。不久,我们将Rx移植到了针对Windows Phone 7的Microsoft. Phone.Reactive上,并且开始在其他语言(如JavaScript和C++)中实现Rx,还用Ruby和Objective-C提供了实验性版本。
在微软内部,第一个使用Rx的用户是Jafar Husain,他在2011年加入Netflix的时候将这项技术带到了那里。Jafar在Netflix大力宣传Rx,最终为Netflix UI的客户端栈重建了全新的架构,以完全支持异步流处理。对于我们来说非常幸运的是,他将自己的热情“传递”给了本•克里斯滕森。当时本正致力于Netflix中间层API的工作,因为Netflix在中间层使用Java,所以本在2012年开始了RxJava的工作,并在2013年初将代码库转移到了GitHub上以便于持续的开源开发。微软中另外一个较早的Rx采用者是Paul Betts,他在去GitHub工作之后成功地说服了GitHub的同事(如Justin Spahr-Summers)实现并在2012年的春天发布了针对Objective-C的ReactiveCocoa。
随着Rx在业界越来越流行,我们在2012年秋天说服微软Open Tech开源了Rx.NET。此后不久,我离开微软并创建了Applied Duality公司,并将全部时间用于使Rx成为标准的跨语言和跨平台的API,以异步实时处理数据流。
时间很快来到2016年,Rx越来越受欢迎,使用范围也急速扩大。Netflix API的所有流量都基于RxJava, Hystrix容错库也依赖于RxJava,该库隔离了所有的内部服务流量。通过相关的反应式库RxNetty和Mantis, Netflix正在创建一个完全反应式的网络栈,用于跨机器和进程边界连接所有的内部服务。RxJava在Android领域也取得了巨大的成功,SoundCloud、Square、NYT、Seatgeek等公司的Android应用程序都在使用RxJava,并为RxAndroid扩展库贡献了力量。NoSQL厂商,如Couchbase和Splunk,为它们的数据访问层提供了基于Rx的绑定功能。其他采用RxJava的Java库包括Camel Rx、Square Retrofit和Vert.x。RxJS被JavaScript社区广泛采用,并为Angular 2等流行框架提供了强大的支持。该社区维护了一个网站(http://reactivex.io/),在那里可以找到许多语言中Rx实现的相关信息,以及精美的弹珠图和David Gross(@CallHimMoorlock)的阐述。
自诞生起,Rx就随着开发者社区的需求和输入而不断发展。在.NET中,Rx的最初实现只专注于转换异步事件流,并在需要回压的场景使用异步枚举(asynchronous enumerable)。由于Java没有对异步await的语言级支持,开发者社区使用反应式拉取的概念扩展了Observer和Observable类型,并引入了Producer接口。由于有许多开源贡献者,RxJava的实现非常复杂,但是经过了高度优化。
尽管RxJava的细节与其他Rx实现有细微的差异,但是它依然是专门为全新的分布式实时数据处理领域的开发人员创建的,让他们能够专注于本质复杂性,而不会为偶发复杂性所折磨。本书深入探讨了RxJava的概念和使用,以及Rx的通用理念。两位作者在实现和使用RxJava方面拥有丰富的经验。如果你想学习Java反应式编程,没有比购买本书更好的方法了。
Erik Meijer
Applied Duality公司总裁和创始人