Reactive流介绍

现代系统中的数据是不断变化的,而不是静止的,现代软件越来越多地基于近实时的数据运行。 大数据不如快速数据重要,快速数据对快速knowledge特别重要。流处理是帮助将所有大小的数据尽快转换为knowledge的一种方法。

随着拥抱系统的运动数据,传统的批处理架构正在基于单纯流的架构重新构想。在这些系统中,对实时数据捕获、处理并基于亚秒级响应时间方式用来修改行为(快速及时响应)。 亚秒级响应时间对变化的信息具有重要的商业价值,而传统的基于批处理架构的系统可能需要几小时、几天或甚至数周内响应。 诸如Akka Streams之类的流处理和响应式流等库包提供了有效实现这些系统所必需的标准和管道规范。

适合流处理的系统包括ETL(提取,变换,加载)系统,CEP(复杂事件处理)系统和其他各种报告/分析系统。 甚至有一个不断增长的NoETL运动,类似于NoSQL运动,它承诺经他们系统的方式将提高公司等组织思考数据流的方式。这些可能性是无限的,仅受限于在数据密集型领域工作的软件开发人员的想象力。

Streams简介
流是随着时间的推移不断发射一系列元素。 该系列可能没有开始和结束。而数组是有开始和结束。

这里有一个场景:你想要一系列的整数平均值。 考虑不知道所使用元素的数量的影响;如果你不知道流中的元素数量 - 并且流可能没有结束 - 你如何和何时计算出平均值? 你计算出移动平均线吗? 如果这样,您重新计算平均值的频率? 这些都是在处理流和集合之间的一些细微(而不是微妙的)差异。

让我们将上面的一系列元素可视化为流而不是数组。 A发布了6个元素。 我们及时连接到流来处理其中4个,但是在第6个元素被发出之前断了连接。这突出了流和数组之间的重要区别 - 在流处理系统中,不仅可以而且可以预期,不是流的每个元素都会访问。不仅元素以不同的速度发射 - 有时是以脉冲串形式发射,有时以涓流发射 - 但在许多情况下,我们不能保证处理这些发射的元素。 使用数组有可能返回一个最终的平均值;数组完全在内存中,而流的元素可能甚至不存在。 当没有终点概念时 我们需要重新考虑运动的、不断变化的数据集和运动的变化的值。这取决于我们如何定义运动的外观和行为。

探索Reactive流
Reactive Streams是开发人员的库包规范。开发人员的代码直接基于Reactive Streams,而开发人员将使用Reactive Streams实现构建业务系统。

Reactive Streams于2013年底开始由Netflix、Pivotal和Typesafe的工程师之间发起。 一些最早的讨论开始于2013年开始于Typesafe的Playafe和Akka团队之间。 在那个时候流难以实现 - 播放会有“迭代”,而且对于Scala很多开发人员难以掌握; Akka有Akka IO,但这对于业务级编程来说也太复杂了。 这种讨论不断继续,最终导致Roland Kuhn和Erik Meijer之间的聊天。这段对话萌发了以异步方式上传递数据的Rx方法。 Viktor Klang联系了开发社区的其他成员,开始了一个更大的倡议。

Reactive Streams的目标是提高了抽象层次 -业务开发人员不必担心处理流的低级管道,规范本身定义了这些问题。 然后由库包开发人员为我们处理大多数这些问题。

我们开始定义一个本地协议,避免压垮数据收件者,这样就不会阻塞任何线程,但最终我们应用它的作用域会更大:当以流式传输HTTP有效负载到服务器时,TCP的后压传播应该无缝衔接于对数据执行的流转换。 - Roland Kuhn博士

即使你不是一个使用Reactive Streams兼库的开发人员,理解Reactive Streams计划也是非常有用的。 它的目的是定义和解决流处理空间中的一些最具挑战性的问题。

。。。。
后续有更多关于Reactive Streams详细介绍见原文:
一些Reactive Streams实现的库包如下:
1. RxJava 2.x或RxJavaReactiveStreams with RxJava 1.x
2. Reactor
3. Vert.x
4. Akka Streams
5. Slick

A Journey into Reactive Streams – Medium

(个人观点:使用Reactive Stream + EventSourcing封装在中间件里可能更受欢迎,让流处理散落在应用程序各个地方增加复杂性和调试困难性。)