您的位置:首页 > 其它

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的编码版本

简单示例代码 :
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Akka stream backpress