前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Reactive Streams规范及常见库

Reactive Streams规范及常见库

作者头像
dhyuan
发布2022-05-30 14:22:13
1.2K0
发布2022-05-30 14:22:13
举报
文章被收录于专栏:响应式编程响应式编程

1)什么是Reactive Streams:

Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. This encompasses efforts aimed at runtime environments (JVM and JavaScript) as well as network protocols.

概括的说,Reactive Streams 是个规范,它规范了“有非阻塞背压机制的异步的流处理”。挺简单的定义,但是能够真正正确理解异步、非阻塞并不容易,以后单独开写一篇。实际上Reactive Streams规范或者说它的第三方代码实现包含的内容更加丰富:除了non-blocking,还有:Composable、Deferred、Flow Controll、Resilient、Interruptible。

其中Composable就是函数式编程思想的用武之地。 可体会下Java8里的Stream API各种算子的参数,所以Lamda表达式是进行Reactive Streams实现的基本前提,否则很难想象臃肿的面向对象的Composable。有了JDK8的铺垫,Reactive Streams接口被JDK9定义在Flow里才是可能的。

As of August 23rd, 2019 we have released version 1.0.3 of Reactive Streams for the JVM, including Java API, a textual Specification, a TCK and implementation examples.

这个规范由三部分组成:Java API(org.reactive-streams)、以文字描述的规范、技术兼容工具包。 Reactive Streams 规范 仅限于 Java(JavaScript、网络协议)世界,其它语言虽然也有 Reactive 这样的工具(参考这里:ReactiveX)实现,但好像没有类似的规范。

2)为什么要有 Reactive Streams

因为很多厂商开发了 reactive 库,但是它们直接很难/不可能互操作。用 Reactive Streams 进行规范就使得它们可以互操作,也就让它们串起来形成一个 reactive 链成为了可能。

3)为什么要用 Reactive

因为 reactive 可以榨干 CPU...,所以从老板的角度讲是省钱、从环保的角度讲是省电、从码农的角度讲是有意思。

4)Java 世界里知名的 Reactive 库

RxJava

从 Reactive 宣言、到 Reactive Streams 规范,再到各种 Reactive 库是很自然的一个脉络。但现实是大家先有了 Reactive 系统的思想,聪明的程序开发出各种蕴含着 reactive 思想的库(比如 RxJava 1.0)。为了各个库之间的统一性、可操作性,大家一起协商出了 Reactive Streams 规范。继而这些已经存在的 reactive 库便改进自己的 API 设计,向 reactive streams 规范靠拢并提供各种转化 api 让用户在原生 api 和 reactive streams 接口直接转换。比如 RxJava 2.0 的 Flowable 就直接继承自 org.reactive-streams.Publisher 并提供了 toObservable() toFlowable()。因为各个库的实现细节不同,用到具体转换 api 需要参考其手册。

RxJava虽然是java ractive编程的领路人,并且RxJava跟Project Reactor 3.0 基本是等价的。但是考虑到Spring生态的强大,估计其前途不会太光明了。

JDK

这个规范被的 API 形式定义从 JDK 9 这个版本开始,以 java.util.concurrent.Flow 静态子类的形式被定义。其实,既然已经有了 org.reactive-streams 这样的规范,为什么还要在 JDK 中弄出个 Flow 来再重新定义一次。难道就是要宣示 JDK 自身有支持 reactive streams 的东西?

这个思路的本意应该就像 JDBC 接口一样,让 Flow 里定义的接口成为 SPI,让不同供应商的 reactive sreams 可互操作吧。所以 JDK 里的 Flow 中定义的东西不能算是库,而是个 SPI:Service Provider Interface。

Vert.x、MongoDB 响应式流驱动

这些都做了改进以符合 org.reactive-streams 中的 API 定义。其中Vert.x不仅提供了对 java 的 reactive 库,还有 JavaScritp、Ruby、Scala 等。

Spring 的 Project Reactor

https://projectreactor.io/docs/core/release/reference/

既然 Spring 都提供了对 Reactive Streams 的实现,感觉其实上面列出的几个库已经没有太多的意义。各家对Reactive Streams规范的实现在细节上都有很大不同,因为Spring 的生态太强大了,如果没有特殊的需求,比如 JDK 小于 8,那么我们的项目基本于 Project Reactor,那么应该是较好的选择。这个网页 https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Intro 可以帮助操练 Reactor Api。

Project Reactor 到目前为止经历了 1.0, 2.0, 3.3。其中 1.0 这个阶段还没有 Reactive Stream 是规范。在 2.0 开始 follow 规范并基本定型。3.0 感觉是个重构版,形成 reactive-streams-commons 库。这里是 3.0 的 release 文档: https://github.com/reactor/reactor-core/releases?after=v3.0.0.RELEASE 。

有了 Project Reactor 这样的基础库,整个 Spring 组件基本都有了 Reactive Style 的版本,在这个基础上用 Netty(或 Servet 3.1 Containe)+ Reactive Streams 适配层 + Spring Security Reactive + WebFlux + Spring Data Reactive Repository,就可以构建出重头到尾的 Reactive 应用。

从 Spring Cloud 的组件角度讲,也衍生出 Reactive Discovery Client, Reactive Load Balancer, Blockhound, Reactor Debug, Improved Reactor Micrometer Support, Reactor Netty Metric ...

Stephane 是实现Project Reactor的主力,下面是他的两个视频链接: https://www.youtube.com/watch?v=Tr04KiJdAXQ https://www.youtube.com/watch?v=zls8ZLry68M

其它编程语言的 Reative 库

其它编程语言的 Reative 库可参考:https://github.com/ReactiveX 另,Akka Stream:https://doc.akka.io/docs/akka/current/stream/stream-introduction.html

Reference: https://www.reactive-streams.org/ https://www.youtube.com/watch?v=Cj4foJzPF80&list=PLVoESeXbuo-yWN1HW5g45v6eGEPOcfWU0&index=4&t=2940s

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 响应式编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1)什么是Reactive Streams:
  • 2)为什么要有 Reactive Streams
  • 3)为什么要用 Reactive
  • 4)Java 世界里知名的 Reactive 库
    • RxJava
      • JDK
        • Vert.x、MongoDB 响应式流驱动
          • Spring 的 Project Reactor
          • 其它编程语言的 Reative 库
          相关产品与服务
          云数据库 MongoDB
          腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档