Akka Stream BackPress 技术(个人处女作啊, Be nice to me^_^)
2015-07-01 15:33
337 查看
问题引入:有一个超大的CSV文件,150 Million条记录,需要调用一个REST接口,从
欧洲传到美国的服务器上去,如果单线程处理,平均每秒仅仅不到30条/秒,因为网络
状况是不稳定的,CSV文件的读取速度需要和每行记录的处理速度,以及最终rest请求
的接受速度相互匹配
传统解决办法:
- [ ] 假定有N个处理步骤,包括发送REST请求,也算一个,利用N-1个阻塞队列存放
中间结果,在不同的步骤中通过线/进程异步存取中间结果,配置不同的同构线层数
量,队列的长度来控制任务之间的不同的处理速率的矛盾,
+ 配置起来参数多
+ 网络状况不稳定的情况下,参数非常难做到动态可调整,来配合不同时期的网络
数据
+ 服务器端的连接数与并发数量也不好控制
- [ ]使用类似Spark/MR的分布式计算框架,在最后的Map里面完成REST请求的发送和
结果收集
+ 也很难根据rest服务器端的速率调整CSV文件记录的处理和读取参数
- [ ]其他
Akka Stream BackPress技术的引入:
本身Akka Stream 的处理和Unix的管道或者是Spark的RDD transformation很类似,都
是以数据为核心,顺序的传入一系列能处理这种格式(模型)数据的函数,步骤一函
数的输出,作为步骤2函数的输入
最重要的区别改进点在于“AKKA Stream”让使用者不需要再经过各类参数类型的配置,
来调整数据的各个不同步骤的处理速度,而由Stream框架自动完成,以本引入问题为
例,就是如果rest请求现在速度慢下来了,倒数第二个步骤到第一个读取CSV步骤的函
数也会相应的慢下来,相当于每一个步骤都是一个Actor,他除了可以处理数据,完成
自己的责任外,还能在自己忙的时候通知前面步骤的Actor,"慢点慢点,我这里的工作
处理不过来了,你给我少安排些活",同一步骤的多个Actor实例(干同样工作的人),
也可以互相分担工作量(处理的记录数量)
其他Akka Stream的技术:
1) Flow : 通过不同的条件控制不同的数据流结构,可以有分支,过滤,负载均衡路由的不同
的配置,有点类似pentaho DI的编码版本
简单示例代码 :
欧洲传到美国的服务器上去,如果单线程处理,平均每秒仅仅不到30条/秒,因为网络
状况是不稳定的,CSV文件的读取速度需要和每行记录的处理速度,以及最终rest请求
的接受速度相互匹配
传统解决办法:
- [ ] 假定有N个处理步骤,包括发送REST请求,也算一个,利用N-1个阻塞队列存放
中间结果,在不同的步骤中通过线/进程异步存取中间结果,配置不同的同构线层数
量,队列的长度来控制任务之间的不同的处理速率的矛盾,
+ 配置起来参数多
+ 网络状况不稳定的情况下,参数非常难做到动态可调整,来配合不同时期的网络
数据
+ 服务器端的连接数与并发数量也不好控制
- [ ]使用类似Spark/MR的分布式计算框架,在最后的Map里面完成REST请求的发送和
结果收集
+ 也很难根据rest服务器端的速率调整CSV文件记录的处理和读取参数
- [ ]其他
Akka Stream BackPress技术的引入:
本身Akka Stream 的处理和Unix的管道或者是Spark的RDD transformation很类似,都
是以数据为核心,顺序的传入一系列能处理这种格式(模型)数据的函数,步骤一函
数的输出,作为步骤2函数的输入
最重要的区别改进点在于“AKKA Stream”让使用者不需要再经过各类参数类型的配置,
来调整数据的各个不同步骤的处理速度,而由Stream框架自动完成,以本引入问题为
例,就是如果rest请求现在速度慢下来了,倒数第二个步骤到第一个读取CSV步骤的函
数也会相应的慢下来,相当于每一个步骤都是一个Actor,他除了可以处理数据,完成
自己的责任外,还能在自己忙的时候通知前面步骤的Actor,"慢点慢点,我这里的工作
处理不过来了,你给我少安排些活",同一步骤的多个Actor实例(干同样工作的人),
也可以互相分担工作量(处理的记录数量)
其他Akka Stream的技术:
1) Flow : 通过不同的条件控制不同的数据流结构,可以有分支,过滤,负载均衡路由的不同
的配置,有点类似pentaho DI的编码版本
简单示例代码 :
相关文章推荐
- Java IO与NIO的一些文件拷贝测试
- Stream、WshShell、WshUrlShortcut对象及Shell.Application的参数与使用
- Node.js中的流(Stream)介绍
- php中stream(流)的用法
- php错误提示failed to open stream: HTTP request failed!的完美解决方法
- C# Stream 和 byte[] 之间的转换
- 利用stream实现一个简单的http下载器
- 浅谈PHP中Stream(流)
- php常用Stream函数集介绍
- Play! Akka Flume实现的完整数据收集
- Spray.io搭建Rest服务
- Spray.io搭建Rest — 支持Twirl模板并部署
- akka-rpc(基于akka的rpc实现)
- pgpool-II+Hot_standby+Streaming replication环境搭建
- jfinal-mailer一款支持线程池的异步邮件,可以使用freemarker作为模板的邮件插件
- jfinal-akka 使用akka执行异步任务
- spark总体概况
- ScalaMP ---- 模仿 OpenMp 的一个简单并行计算框架
- Scala: 一次命令式到函数式的重构
- 标签 stream_context_create - 第1页 -- 简明现代魔法