问题引入:有一个超大的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 : 通过不同的条件控制不同的数据流结构,可以有分支,过滤,负载均衡路由的不同
欧洲传到美国的服务器上去,如果单线程处理,平均每秒仅仅不到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的编码版本
简单示例代码 :