作者 | 赵钰莹

近日,Linux 基金会宣布成立 Reactive 基金会。对于 Reactive,各位开发者应该并不陌生,尤其是 Node.js 开发者,但真正了解并意识到这件事情对开发方式带来的影响的恐怕不多。本文,InfoQ 有幸第一时间对推动阿里巴巴成为该基金会初创成员的阿里巴巴资深技术专家雷卷进行了独家采访,进一步全面了解 Reactive 基金会的成立背景及其对开发方式的发展推动。

Reactive 基金会是什么?

近日,Linux 基金会宣布启动 Reactive 基金会,旨在加速发展构建下一代网络应用程序的架构。该基金会由阿里巴巴、Facebook、Lightbend、Netifi 和 Pivotal 等初始成员组成。涉及成功的开源规范 Reactive Streams 和 RSocket,以及编程语言实现。

虽然 Reactive 基金会刚刚成立,但 Reactive,也就是开发者常说的响应式编程,已经发展多年。2011 年,Reactive 就开始步入大众视野,当时微软在 .Net Framework 4.0 中内置了Reactive 支持,称之为 Reactive Extensions。2013 年,广大 Java 开发者熟知的 RxJava 发布。接下来,Reactive 进入飞速发展阶段,先后出现了 RxRuby、RxJS(感兴趣的开发者可以访问 http://reactivex.io/  )等。

在技术的发展过程中,各大厂商也开始陆续跟进,比如 Reactive 宣言、Lightbend 的 Akka、Spring 的 Reactor 项目,Spring Reactive Web 等,新兴的微服务框架基本都是 Reactive 的,比如 Vert.x,Micronaut 等。 很多开发者对 Reactive 的理解是开发包,比如 Android 中整合 RxJava、Spring 中的 Reactive Web。但是,RSocket 的出现将 Reactive 扩展到分布式场景,让所有应用都可通过 Reactive 和 RSocket 的方式串联起来。

至于为什么 Reactive 可以迅速被广大开发者接受,比较典型的两大价值如下:

  • 非阻塞和高并发: Reactive 基于异步消息通讯,与 Node.js 的 Event Loop 设计类似,这样的应用没有同步阻塞,系统吞吐率较高,相当于提升了系统性能。之前,开发者采用线程池来实现并发,现在通过 Actor 的消息模型,消除了获取线程的等待,减少了大量线程的切换,CPU 利用率提升。此外,非阻塞和高并发对云上客户尤为重要,CPU 利用率和 QPS 提升直接意味着账单金额变少;
  • 函数式编程范式: 函数编程已经越来越被开发者接受,拥有线程安全、高效执行等优点,但是将这些函数串联起来工作,需要一定范式和相关框架,这就是 Reactive 做的事情,比如标准的 Reactive Streams 规范,相关的开发框架 RxJava、Reactor 等,可让函数编程更加简单,而且代码还是统一风格,阅读简单的同时,Code Review 也非常容易。这就好比 Java 中有 Servlet 规范,众多 Web 框架来简化 Web 应用开发一样。如果在代码中看到 filter、 map、flatMap、subscribe 等函数调用,基本就是 Reactive 的雏形。

Reactive 基金会的出现则无疑会将这一技术的价值在未来最大化。据雷卷透露,整件事情在 2018 年底就已启动。当时,阿里巴巴与 Netifi、Pivotal 和 FaceBook 在共同开发 RSocket 相关开源产品。虽然,Reactive 这个词经常被提及,但是知道的开发者还是比较少,几家公司觉得需要让更多开发者知道这项技术,因此有了成立基金会的想法。雷卷表示:

整个筹备过程花费了不到半年的时间,主要得力于 Netifi 和 Pivotal 的支持,虽然很多人还不是特别了解 Reactive,但是 Linux Foundation 的很多人对技术方向的把握还是很到位的,所以在半年不到的时间就完成了 Reactive 基金会的创建。

大部分开发人员对这几家初创成员公司都不陌生,比如微服务领域比较火的 Spring Framework 就是 Pivotal 在维护开发。之后,这几家公司将共同参与到基金会的工作中,雷卷表示,Pivotal 主要致力于将 RSocket 与 Spring 生态进行融合;Netifi 是 RSocket SDK 核心开发团队,同时有自己的 RSocket Broker 商业产品;Facebook 也致力于 RSocket 的开发,其中,RSocket-cpp 和 RSocket-js 主要都是 Facebook 的工程师在维护,同时,Facebook 内部也在积极推动 RSocket 落地;Lightbend 可能很多开发者觉得陌生,但它是 Scala 语言背后的支持公司,同时也是响应式编程的先行者,支持着 Akka 平台的开发;阿里巴巴主要集中于 RSocket 的开发,基于 Reactive 和 RSocket 将分布式开发推向下一个高度,同时也在积极开发内部的 RSocket 产品,该产品将为云上客户提供服务。

Reactive 基金会成立的出发点就是推动 Reactive Streams 和 RSocket 的发展,这对后续的 Reactive 产品开发有非常大的指导意义,保证了这些 Reactive 产品在 API 和协议上都是兼容的,这对最终开发者而言非常重要。

具体来说,Reactive 基金会将首先推动 RSocket 1.0 规范的落地,包括各种语言的 SDK 开发,这是一件工作量大且繁琐的工作,各种语言、测试、性能等相应工作都需要配合进行。对开发者来说,Reactive 基金会将带来很多价值,比如持续推动规范演进、SDK 开发、文档、会议支持等,同时也是各 Reactive 产品对开发者的介绍窗口。

Reactive 对开发方式带来的改变?

事实上,Reactive 的出现对现有架构带来许多冲击,比如基于事件驱动设计、流式处理、Service Mesh、无网络依赖、安全等。相应的,开发方式也会随之发生改变,越来越多的框架开始全面支持 Reactive,比如 Spring WebFlux、Spring Data Reactive Repository 等;数据库操作,通过 R2DDBC 方式已经完全 Reactive 化;各种 NoSQL 产品,比如 Redis、MongoDB 等,早已支持 Reactive;RPC 和 HTTP REST API 在 RSocket 的影响下可能也会改变开发者对分布式通讯的认识。在这些改变和冲击中,最典型的就是代码编写和分布式通讯。

  • 代码编写: 我们之前过程式的代码,将会被函数式编程和 Reactive 范式替代,之前代码中大量的 if else, null 判断,for 循环,try/catch 等,都会极大地减少,取而代之是 Reactive 的各种标准操作,更加简单明了,代码量也会显著减少。
  • 分布式通讯:之前分布式开发,我们非常注重通讯细节和并发的处理,这个是核心,Reactive 和 RSocket 的介入,会让开发门槛会降到最低,你几乎不用关心通讯的底层细节、并发线程数处理、断路保护等,这一切 Reactive 下的 RSocket 就给你解决啦,你可能只用关系接口设计和数据序列化。现在的应用越来越追求极致性能,CPU、GPU 和 FPGA 等全都上,如果没有匹配的高效通讯协议,那么性能会打折不少,而这一切 RSocket 都可以帮你做到,而且更加简单和优雅,我们稍后也会介绍 RSocket。

可以说,即便开发者现阶段不关注 Reactive,这一暗潮也已经在涌动。与此同时,业界也存在很多 Reactive 和 Java 整合的一些技术,这些技术让 Reactive 更加成熟且稳定:

  • Reactive 框架: RxJava, Reactor, Akka, Kotlin Coroutines & Flow
  • Web 框架: Spring WebFlux, Vert.x, Micronaut, Helidon
  • 数据层: Spring Data Reactive,支持 database, Redis, Cassandra, MongoDB 等等
  • 通讯层: RSocket, Reactor Netty, Reactor Aeron,Reactive Dubbo
  • 集成:  Reactor Kafka, Reactor RabbitMQ,RocketMQ 等

如今,越来越多的开发者开始习惯基于云平台开发应用。如上文所言,Reactive 的发展对云原生领域的发展也将起到很大作用。在采访中,雷卷透露,云原生可让应用独立于底层架构,保持中立,进而可运行在不同云厂商的底层架构上。 但是,这一方式并没有解决应用之间如何进行通讯的问题,虽然有基于 API 的协作,但是并没有对 API 做出具体要求,尤其是基于消息的异步通讯。

目前最常见的应用间通讯就是 RPC 和 HTTP REST API。这两者对于 request/response 的通讯完全没有问题,HTTP REST API 只是有一些性能问题,但是整体还好。不过,这些技术也都在向 Reactive 靠拢,比如 Spring 的 RestTemplate 转向 WebClient,而 gRPC 也有对应的 Reactive gRPC 等。对于新的架构设计,比如 Streaming、Event Driven、IoT 和双向通讯,传统的 RPC 就有点力不从心,而这些正是 RSocket 所擅长的。

RSocket 协议经过非常长时间的论证,当然也借鉴了其他协议的思想,终于形成了目前开发者看到的 1.0.0 版本。RSocket 协议可以说是目前基于二进制异步消息通讯比较完美的版本,克服了之前协议设计中的一些问题,比如 Client/Server 转换到角色对等的方式;Pub/Sub 调整为更灵活的 Request/Stream;元数据和数据分离的方式,提供更灵活的消息路由和消息编码;传输层可插拔,支持 TCP、WebSocket、UDP/Aeron、RDMA 等;同时支持多语言接入,比如 Java、Kotlin、Node、C++、Golang、Python、Rust 等。

目前,RSocket 已经受到广泛支持,Spring Framework 将在 5.2 版本内置 RSocket,Spring Boot 2.2.0 版本也第一位支持 RSocket,其他 Spring Cloud Gateway,Spring Security 等都会支持 RSocket。正如 Linux 基金会战略副总裁 Michael Dolan 所言,Reactive 基于消息驱动的方式可以保证云原生应用所需的弹性,可伸缩性和响应能力,而且这一切都不受其底层基础架构的影响。换言之,利用 Reactive 的特性,开发者不需要依赖云厂商或者 Infra 层就可以达到 Reactive 宣言所说的弹性、可伸缩性和响应能力。可以说,云原生关注应用的外在,比如打包部署、运行环境、监控等,而 Reactive 更关注应用内在,比如代码运行的更有效率,应用间通讯更加自然流畅,一定的弹性和自我恢复能力等。

阿里巴巴 Reactive 实践及开源计划

作为 Reactive 基金会的初创成员之一,阿里巴巴一直给外界的印象都是内部使用了大量 Java 编程语言,积累了大量的 Java 技术栈。但是,据雷卷透露,阿里巴巴内部的一些产品很早就开始进行 Reactive 化,比如开发者都了解的 Dubbo,就在做 Reactive 和 RSocket 的整合。但是,Reactive 化的过程还有很多问题需要解决,比如 SDK 的 BUG,适配内部各种架构体系。雷卷认为,最大的问题就是如何将阻塞调整为非阻塞方式,比如数据库操作,非异步的 RPC 调用。

作为基金会的一员,阿里巴巴会将内部 Reactive 化的经验共享给需要的开发者,主要贡献将偏向于 RSocket,主要是分布式 Reactive 与云上的整合,因为阿里巴巴在安全、性能测试、SDK 开发上面都贡献了非常多,同时结合云上的特点以及多租户支持,让云上用户使用更简单。  在内部,阿里巴巴也积极推动产品 Reactive 化,添加对 RSocket 支持等。

在技术革新的同时,阿里巴巴还在着力解决成本问题,如果开发者听过 QCon 2019 北京大会上的 RSocket 演讲,可能会对 Netifi 公司通过研发 RSocket 帮助企业实现微服务,在 40,000RPS 的场景下,Istio 需要每月 3495 美金,而 Netifi 每月只要 388 美金,同时性能提升 10 倍有印象,这对任何企业无疑都极具吸引力。从那次演讲到现在已有半年之久,新推出的 RSocket Broker 已经支持多租户特性,而非独占的方式,成本可再次降低 50% 到 70%,在 4 万 RPS 场景下,每月只要支付 200 美元不到。

虽然阿里巴巴的 Reactive 进程还在进行中,但其带来的成本价值已经有所体现。雷卷表示,主要是同步转异步后,应用的总体性能提升,直接变化就是费用花销变少,这对其他用户而言应该也是一样的。

结束语

对 Node.js 开发者来说,如今几乎都是 Reactive,而对 Java 开发者来说,尤其是后端,目前还处于早期阶段,目前遇到最大的问题是,Reactive 要求用户调整代码,这是最大的麻烦,开发者需要很长时间熟悉、了解和使用。而且相关整合还不完善,虽然 Spring 5.0 已经包含 Reactive,但并不是所有都支持。雷卷表示,Spring 5.2 将从底层全面支持 Reactive,一旦该版本正式发布,开发者就可以体会到 Reactive 和 RSocket 开发的便捷性。

在开源方面,阿里巴巴正在研发 RSocket Broker 产品,希望可以很快推出,让更多开发者能够更好地使用 Reactive,帮助云原生应用解决异步通讯问题,让所有组织和开发者可以更简单、高效、安全,同时极大降低成本。

作者介绍:
雷卷,阿里巴巴资深技术专家,目前就职于阿里巴巴硅谷办公室。在阿里巴巴工作 10 余年,具备 20 年 Java 开发经验,参加过多个内部项目,从物流、旺铺到国际部中间件等。目前主要的研究方式是 Reactive 和 RSocket,将 Reactive 和 RSocket 带到应用开发中,构建更加简单高效的架构设计。雷卷同时也是 RSocket 的开发者,主要着重于 RSocket Broker 的开发。

阿里雷卷:Reactive 基金会的成立将对开发方式带来哪些影响?的更多相关文章

  1. 阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性

    作者 | 阿里巴巴资深技术专家  雷卷,GitHub ID @linux-china 导读:在 Python.JavaScript 等一众编程语言崛起风靡之际,一代霸主 Java 风采虽不及当年,但仍 ...

  2. AWS EC2避免误删软件包和数据的方法:取消“终止删除”默认配置

    本文介绍AWS在终止实例的时候如何保留根卷,避免误删软件包和数据. 作者:光环云 尹晓征 在aws控制台创建EC2的时候,我们在添加存储步骤中,如果使用默认配置的情况下,“终止时删除”配置默认是被选中 ...

  3. .NET基金会成立

    作者 Jonathan Allen ,译者 臧秀涛 发布于 2014年4月8日 随着.NET基金会的成立,微软在成为主要的开源参与者的道路上又前进了一步.该基金会的宗旨是“成为越来越多的开源.NET项 ...

  4. TOP100summit 2017:投资千亿成立达摩院,揭秘阿里在人工智能领域的探索

    今天上午,阿里巴巴云栖大会在杭州开幕,第一条重磅消息是阿里首席技术官张建锋宣布成立达摩院,在全球各地建立实验室,3年内投入千亿在全球建立实验室.和高校建立研究所.建立全球研究中心等事务. 该院由全球实 ...

  5. 重磅来袭!Reactive 架构专场四城巡回演讲

    Reactive 究竟是什么?Reactive 对架构设计的影响和冲击,以及给开发方式带来的改变有哪些?为什么阿里巴巴.Pivotal.Facebook 纷纷在生产环境中实践 Reactive? 本次 ...

  6. 灵雀云获邀加入CDF(持续交付基金会),成为中国区三大创始成员之一

    3月12日,在加州Half Moon Bay举行的开源领导者峰会(Open Leadership Summit 2019 )上,CDF(Continuous Delivery Foundation ) ...

  7. CNCF 宣布成立应用交付领域小组,正式开启云原生应用时代

    作者|赵钰莹 作为云原生领域的顶级开源社区, Cloud Native Computing Foundation (云原生基金会,以下简称 CNCF)近日宣布成立 Application Delive ...

  8. Eclipse基金会

    昨天Eclipse基金会庆祝其成立十周年.2004年2月的新闻稿宣布该非盈利组织的正式成立,由包括开发者.消费者和插件提供商在内的各独立团体组成的董事会,为Eclipse的长期发展负责. 基金会成立时 ...

  9. 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】

    阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...

随机推荐

  1. nginx负载均衡策略url_hash配置方法

    参考文章: https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/ 根据路径,进行一致性hash,具体的配 ...

  2. RE最全面的正则表达式----终结篇 特殊处理

    三.特殊需求表达式 Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0- ...

  3. Spring Boot之Profile--快速搞定多环境使用与切换

    Spring Profile是Spring3引入的概念,主要用在项目多环境运行的情况下,通过激活方式实现多环境切换,省去多环境切换时配置参数和文件的修改,并且Spring profile提供了多种激活 ...

  4. lumen错误 NotFoundHttpException in RoutesRequests.php line 442:

    解决:进入 public/index.PHP 将 $app->run(); 修改成下面的: $request = Illuminate\Http\Request::capture(); $app ...

  5. java-初读 HashTable

    有用的标识符 transiant 有用的属性 初始容量11 加载因子0.75 这里理解如果要经常插入大量数据可以增大加载因子 有用的方法 @Test public void testNan() { l ...

  6. listary的使用心得

    1.关键字里面的 web 不仅仅可以打开网页也可以打开电脑上的应用程序. 2.但是呢,有时候虽然 URL 指向了正确的 exe 但是却打不开相应的软件.这是为什么呢?(有其他方法可以打开) 我在这里提 ...

  7. Spark流式编程介绍 - 编程模型

    来源Spark官方文档 http://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#programm ...

  8. Jenkins教程——从安装到部署Docker服务(一)安装Jenkins

    前言 写了好久Jenkins的脚本了,写得虽然不是太好,但是可以基本满足需要,最近比较忙,这个月也没怎么更新博客,开始更新Jenkins这个系列的文章,打算从安装Jenkins -> 流水线工程 ...

  9. 一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!

    不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...

  10. POJ 1015 陪审团问题

    题意略. 思路: 这个题目开始我本来打算用个二维dp,令dp[ i ][ j ]为考虑前i个人,有j个名额的时候,我所能获取的最小差,后来发现不好转移.因为dp[ i ][ j ]有可能是+2, 也有 ...