最近在项目中需要实现图的一些操作,因此,初步考虑使用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的更多相关文章

  1. Akka Stream文档翻译:Motivation

    动机 Motivation The way we consume services from the internet today includes many instances of streami ...

  2. 报错:Flink Could not resolve substitution to a value: ${akka.stream.materializer}

    报错现象: Exception in thread "main" com.typesafe.config.ConfigException$UnresolvedSubstitutio ...

  3. Lagom学习 六 Akka Stream

    lagom中的stream 流数据处理是基于akka stream的,异步的处理流数据的.如下看代码: 流式service好处是: A: 并行:  hellos.mapAsync(8, name -& ...

  4. Akka Stream文档翻译:Quick Start Guide: Reactive Tweets

    Quick Start Guide: Reactive Tweets 快速入门指南: Reactive Tweets (reactive tweets 大概可以理解为“响应式推文”,在此可以测试下GF ...

  5. Akka(18): Stream:组合数据流,组件-Graph components

    akka-stream的数据流可以由一些组件组合而成.这些组件统称数据流图Graph,它描述了数据流向和处理环节.Source,Flow,Sink是最基础的Graph.用基础Graph又可以组合更复杂 ...

  6. Akka(19): Stream:组合数据流,组合共用-Graph modular composition

    akka-stream的Graph是一种运算方案,它可能代表某种简单的线性数据流图如:Source/Flow/Sink,也可能是由更基础的流图组合而成相对复杂点的某种复合流图,而这个复合流图本身又可以 ...

  7. Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介

    在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定.一般的解决方法是采用回调函数(callback-function)来实现的,但这样的解决方案很容易造成“回 ...

  8. Akka(20): Stream:压力缓冲-Batching backpressure and buffering

    akka-stream原则上是一种推式(push-model)的数据流.push-model和pull-model的区别在于它们解决问题倾向性:push模式面向高效的数据流下游(fast-downst ...

  9. Akka(21): Stream:实时操控:人为中断-KillSwitch

    akka-stream是多线程non-blocking模式的,一般来说,运算任务提交到另外线程后这个线程就会在当前程序控制之外自由运行了.任何时候如果需要终止运行中的数据流就必须采用一种任务柄(han ...

随机推荐

  1. 分治 - 计算几何 - BZOJ2458,[BeiJing2011]最小三角形

    http://www.lydsy.com/JudgeOnline/problem.php?id=2458 [BeiJing2011]最小三角形 描述 Frisk现在遇到了一个有趣的问题. 平面上有N个 ...

  2. django项目在uwsgi+nginx上部署遇到的坑

    本文来自网易云社区 作者:王超 问题背景 django框架提供了一个开发调试使用的WSGIServer, 使用这个服务器可以很方便的开发web应用.但是 正式环境下却不建议使用这个服务器, 其性能.安 ...

  3. 我给女朋讲编程网络系列(2)--IIS8 如何在本地发布网站

    通过IIS8 在本地发布网站,一个截图,你就全明白了,越是简单,越是实用. 如果有现成的网站,就将你的网站放到一个文件夹中,比如WebTest2中. 如何没有网站,可以在WebTest2中新建一个in ...

  4. Leetcode 556.下一个更大元素III

    下一个更大元素III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 12 输出: ...

  5. js后台提交成功后 关闭当前页 并刷新父窗体(转)

    原文地址:http://www.cnblogs.com/chenghu/p/3696433.html 后台提交成功后 关闭当前页 并刷新父窗体 this.ClientScript.RegisterSt ...

  6. [oldboy-django][2深入django]Form组件功能: 数据格式验证 + 保留上次输入的值

    1 需求:登录或者注册页面存在以下问题 - 无法记住上次提交的内容,(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)- 重复进行提交数据的校验(数据是否为空,长度大小等等) 2 d ...

  7. tomcat 服务不支持 chkconfig 以及其他服务不能添加到开机启动时的操作

    在安装完tomcat后想添加的开机自启动的操作,但是报错tomcat 服务不支持 chkconfig,后来在  /etc/init.d/tomcat中的#!/bin/bash后添加上#chkconfi ...

  8. pat 甲级 1056. Mice and Rice (25)

    1056. Mice and Rice (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mice an ...

  9. 【CF1068C】Colored Rooks(构造)

    题意: 思路: #include<cstdio> #include<cstring> #include<string> #include<cmath> ...

  10. LOJ#2131. 「NOI2015」寿司晚宴

    $n \leq 500$,$2-n$这些数字,两个人挑,可以重复挑,问有几种方案中,一个人选的所有数字与另一个人选的所有数字都互质. 不像前两题那么抠脚.. 如果$n$比较小的话,可以把两个人选的数字 ...