reactive stream

602 阅读2分钟

什么是反应式流?和java8的stream是一回事吗

The Problem

在异步系统中,处理数据流——尤其是容量不是预先确定的“热序列”数据——需要特别小心。最突出的问题是需要仔细控制资源消耗,以便快速的数据流不至于压垮下游的服务。为了尽可能的榨干机器/服务(本地/远程)的计算资源,使用异步是非常必要的。

反应式流的主要目标是管理异步边界的流数据交换/传递——考虑将元素传递到另一个线程或线程池——同时确保接收端不会被迫缓冲任意数量的数据。换句话说,回压是这个模型的一个组成部分,为了允许两个线程之间传递信息的队列有界(缓存有限数量)。如果回压信号(backpressure出现)是同步的,那么异步处理的好处就没有了,因此,我们要小心地要求反应式流实现的所有方面都是完全非阻塞和异步的。

这个规范的目的是允许创建许多符合规则的实现,这些实现通过遵守规则将能够顺利地进行互操作,在流应用程序的整个处理图中保持上述好处和特征。

Summary

In summary, Reactive Streams is a standard and specification for Stream-oriented libraries for the JVM that

  • process a potentially unbounded number of elements(无限个元素)
  • in sequence,(顺序的)
  • asynchronously passing elements between components,(组件之间异步传递)
  • with mandatory non-blocking backpressure.(非阻塞的处理回压)

Contrast

名称提供方行为
StreamJDK8Pull
Enumerator、Enumeratee和IterateeHaskell、PlayPull
Observable、ObserverRxJavaPush
FlowableRxJava 2Reactive-Stream
FluxReactor 3Reactive Stream
Source、Flow、SinkAkkaReactive Stream

关于推和拉还有reactive stream的区别,参考第三篇引用文档。

下游组件和上游组件之间的速率适配,是几乎完全由下游组件主动控制。并且会在他们之间进行动态地协调。由于缓冲区的存在,且不等1,所以,当下游组件更快的时候,整个模型会自动地调整为“推”的模式;而当上游组件更快的时候,整个模型又会自动地调整为“拉”的模式,而这,就是Reactive Stream的精要所在。

more info:

www.reactive-streams.org/

github.com/reactive-st…

topic.atatech.org/articles/98…