Akka Stream之Graph
最近在项目中需要实现图的一些操作,因此,初步考虑使用Akka Stream的Graph实现。从而学习了下:
一、介绍
我们知道在Akka Stream中有三种简单的线性数据流操作:Source/Flow/Sink。但是当我们需要使用一些复杂的操作,例如扇入和扇出时,可能就需要使用图相关的流操作了。因此,我们可以这样认为,Akka Stream的Graph是一种运算方案,他可能是简单的线性数据流,也可以由基础的流图组合而成的复杂的数据流程。因为Graph只是对数据流运算的简单描述,所以它是可以重复利用的。
二、依赖
要使用Akka Stream的Graph,我们需要添加下面的依赖:
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-stream_2.12</artifactId>
<version>2.5.18</version>
</dependency>
三、构建Graph
Graph是由简单的Flow组成的,这些Flow用作图形中的线性连接以及用作Flow的扇入和扇出点的连接点。Akka Stream目前提供了下面这些连接点:
1、扇出:
(1)Broadcast[T]:(1输入,N输出)给定输入元件发射到每个输出
(2)Balance[T]:(1输入,N输出)给定输入元件发射到其输出端口之一
(3)UnzipWith[In,A,B,...]:(1个输入,N个输出)采用1个输入的函数,给定每个输入的值发出N个输出元素(其中N <= 20)
(4)UnZip[A,B]:(1个输入,2个输出)将元组流(A,B)拆分为两个流,一个是类型A,另一个是类型B
2、扇入:
(1)Merge[In]:(N个输入,1个输出)从输入中随机选取将它们逐个推入其输出
(2)MergePreferred[In]:Merge但是如果元素在最受欢迎的端口上可用,它会从中选择,否则从中随机从其他端口上选
(3)MergePrioritized[In]:Merge但是如果元素在所有输入端口上都可用,它会根据它们的优先级随机选择它们
(4)MergeLatest[In]:(N个输入,1个输出)发出List[In],当第i个输入流发出元素时,发出的列表中的第i个元素被更新
(5)ZipWith[A,B,...,Out]:(N个输入,1个输出),其取N个输入的函数,给出每个输入的值,发出1个输出元素
(6)Zip[A,B]:(2个输入,1个输出)是一个ZipWith专用于压缩和解的输入流A和B成元组流(A,B)
(7)Concat[A]:(2个输入,1个输出)连接两个流(首先消耗一个,然后消耗第二个)
四、例子
现在假设我们需要实现如下图所示的一个Graph

我们可以用akka-stream提供的GraphDSL来构建Graph。GraphDSL继承了GraphApply的create方法,GraphDSL.create(...)就是构建Graph的方法,因此,我们可以使用如下代码创建上图所示的Graph:
val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] =>
import GraphDSL.Implicits._
val in = Source(1 to 10)
val out = Sink.ignore
val bcast = builder.add(Broadcast[Int](2))
val merge = builder.add(Merge[Int](2))
val f1, f2, f3, f4 = Flow[Int].map(_ + 10)
in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out
bcast ~> f4 ~> merge
ClosedShape
})
注意:在这个里面我们需要引入import GraphDSL.Implicits._。是为了将~>(读作边缘,通过或者到),以及他的相反操作<~引入到代码的范围内。
Akka Stream之Graph的更多相关文章
- Akka Stream文档翻译:Motivation
动机 Motivation The way we consume services from the internet today includes many instances of streami ...
- 报错:Flink Could not resolve substitution to a value: ${akka.stream.materializer}
报错现象: Exception in thread "main" com.typesafe.config.ConfigException$UnresolvedSubstitutio ...
- Lagom学习 六 Akka Stream
lagom中的stream 流数据处理是基于akka stream的,异步的处理流数据的.如下看代码: 流式service好处是: A: 并行: hellos.mapAsync(8, name -& ...
- Akka Stream文档翻译:Quick Start Guide: Reactive Tweets
Quick Start Guide: Reactive Tweets 快速入门指南: Reactive Tweets (reactive tweets 大概可以理解为“响应式推文”,在此可以测试下GF ...
- Akka(18): Stream:组合数据流,组件-Graph components
akka-stream的数据流可以由一些组件组合而成.这些组件统称数据流图Graph,它描述了数据流向和处理环节.Source,Flow,Sink是最基础的Graph.用基础Graph又可以组合更复杂 ...
- Akka(19): Stream:组合数据流,组合共用-Graph modular composition
akka-stream的Graph是一种运算方案,它可能代表某种简单的线性数据流图如:Source/Flow/Sink,也可能是由更基础的流图组合而成相对复杂点的某种复合流图,而这个复合流图本身又可以 ...
- Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定.一般的解决方法是采用回调函数(callback-function)来实现的,但这样的解决方案很容易造成“回 ...
- Akka(20): Stream:压力缓冲-Batching backpressure and buffering
akka-stream原则上是一种推式(push-model)的数据流.push-model和pull-model的区别在于它们解决问题倾向性:push模式面向高效的数据流下游(fast-downst ...
- Akka(21): Stream:实时操控:人为中断-KillSwitch
akka-stream是多线程non-blocking模式的,一般来说,运算任务提交到另外线程后这个线程就会在当前程序控制之外自由运行了.任何时候如果需要终止运行中的数据流就必须采用一种任务柄(han ...
随机推荐
- Django基于Pycharm开发之三[LANGUAGE_CODE与TIME_ZONE]
在django/conf/global_settings.py 中,我们可以找到关于language和timezone的通用配置信息,源码如下: # Local time zone for this ...
- 如何看待微软新开源的LightGBM?
GBDT虽然是个强力的模型,但却有着一个致命的缺陷,不能用类似mini batch的方式来训练,需要对数据进行无数次的遍历.如果想要速度,就需要把数据都预加载在内存中,但这样数据就会受限于内存的大小: ...
- CSU-1985 驱R符
CSU-1985 驱R符 Description 阴阳师中有三中稀有度的式神R,SR,SSR,其中R的稀有度最低,每次抽符,会随机得到一种式神,然而子浩君对R式神已经深恶痛绝. 某天,子浩君突然发现, ...
- 二分法 Binary Search
二分法还是比较常见和简单的,之前也遇到过一些二分的相关题目,虽然不难,但是每次都需要在边界问题上诸多考虑,今天听了九章算法的课程,学习到一种方法使得边界问题简单化. 二分法的几个注意点: 1. mid ...
- 三种框架对比react vue 和Angular对比
https://blog.csdn.net/runOnWay/article/details/80103880 angular 优点 背靠谷歌 使用typescript 便于后端人员开发上手 完整 不 ...
- Solr安装 win系统
安装之前需查看:https://lucene.apache.org/solr/guide/7_6/solr-system-requirements.html#solr-system-requireme ...
- Linux中date命令的各种实用方法
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://521cto.blog.51cto.com/950229/935642 在linu ...
- [LOJ#2327]「清华集训 2017」福若格斯
[LOJ#2327]「清华集训 2017」福若格斯 试题描述 小d是4xx9小游戏高手. 有一天,小d发现了一个很经典的小游戏:跳青蛙. 游戏在一个 \(5\) 个格子的棋盘上进行.在游戏的一开始,最 ...
- Apache+Openssl
Apache编译还需要一些依赖: #./configure --prefix……检查编辑环境时出现: checking for APR... no configure: error: APR not ...
- 各种 Python 实现的简单介绍与比较
当谈到Python时,一般指的是CPython.但Python实际上是一门语言规范,只是定义了Python这门语言应该具备哪些语言要素,应当能完成什么样的任务.这种语言规范可以用不同的方式实现,可以用 ...