Akka Streams [10]: Dynamic Streams

Akka Streams 的实体化值可以是任何数据类型,理解了这一点就比较容易理解动态的流处理:就是用实体化值对流进行一些有意思的操作比如动态的创建 Source 或 Sink。此处的动态是指创建的流在实体化运行后,可以接入多个不同的输入或输出。

Akka Streams [9]: Future Interop

Future 是 Scala 自带的异步并发机制。如果数据处理非常费时或是远程的,那么通过 Future 来运行这些操作是非常常见的做法。Akka Streams 提供了方便的 API 来执行这种异步操作。由于 Akka Streams 是基于 Akka Actor 的,另外一种常用的异步操作是和 Actor 的互操作,其机制与 Future 的互操作原理相近,不做单独介绍。

Akka Streams [8]: Operators

Flow DSL 使用各种 Operators 以及 viaMat, via, to, toMat 这些连接构件来灵活的连接各种组件。其底层的功能则是通过 Graph DSL 以及 GraphStage (图步)来完成。GraphStage 是多数 Operator 的具体实现。本文通过给出一个 Operator 的实现例子,然后总结 GraphStage 的创建过程。最后给出 Operators 的大致分类。

Akka Streams [7]: GraphStage

Flow DSL 和 Graph DSL 的目的是灵活的连接各种组件,主要是通过 Shape 来操作的图的连接拓扑结构。如果需要实现类似 Merge, Zip 这种内置了数据处理功能的构件或操作符,需要定制 GraphStage (翻译成“图步”)来完成。GraphStageGraph 的子类,在其形状和属性基础上定义了入口和出口的数据处理逻辑。从下面的例子可以看到,Akka Streams 的基本处理逻辑是 pull-based back pressure 拉驱动的回压机制。通过实现定制 GraphStage 有助于深刻理解 Akka Streams 的实现机制。本文用由简到繁的几个例子加以演示和说明,总结放在下一章。

Akka Streams [6]: Custom Shape

Akka Streams 提供了比较丰富的 Shpae 形状构件来连接数据处理组件。其组合方法比较类似,都是通过创建不同形状的构件之后再按需要连接输入输出端口进行组合。如果已有的 Shape 形状不能满足要求,Graph DSL 允许自定义 Shape 来任意组合组件。同 Flow DSL 一样,Graph DSL 也提供机制指定要保留的实体化值。

Akka Streams [5]: Graph DSL

可以灵活的组合处理单元是 Akka Streams 的另外一个核心功能。当处理流程的图形不是从一个 Source 到零个或多个串行的 Flow 再到一个 Sink 的简单线性结构时,需要用 Akka Streams 提供的 Graph DSL(图形领域特定语言)来构造复杂非线性的处理拓扑结构。Graph DSL 提供了二种方式来构建非线性处理:利用已有的非线性 Shape 和定制有任意数量的入口和出口的 Shape。本文给出第一种的使用方法,定制 Shape 在下文介绍。