Storm Akka Finagle对比及使用场景分析

本文翻译自:http://blog.samibadawi.com/2013/04/akka-vs-finagle-vs-storm.html

By jmppok at 2013.12.12


Storm Akka Finagle对比及使用场景分析


1 概述

Storm、Akka、Finagle是三个开源的分布式并行处理框架,都基于JVM运行。
他们在解决下面这些问题上十分有用:
1)实时数据分析;
2)构建包含大量输入输出的复杂网站;
3)金融;
4)多人在线游戏;
5)大数据;

三个框架针对不同的问题进行了优化,但我们具体应该使用哪个框架来解决哪些问题呢?下面进行具体的分析。

2.30秒,简单回顾并行处理历史


并行/并发程序设计十分困难,C/C++在1990s开始支持最基本的并行处理。

1995年Java引入了monitor机制(多线程),从而简化了在单机上的并行程序设计,但是当你有大量线程时很容易出现死锁问题,同时多线程也无法实现基于多台机器的并行计算。

随着数据量的不断增长,大数据越来越需要一个更好的并行处理框架。

3.MapReduce 和Hadoop

Hadoop是Google 并行处理框架MapReduce的开源实现,它是一个批处理系统,通过将一个算法拆分为一系列的Map和Reduce步骤实现并行。其中Map是完全并行的,Reduce收集Map的处理结果。

Hadoop本身的学习曲线很高,有大量的依赖库/软件,因此除非你没有其他选择,最好不要使用Hadoop。
其他的一些基于Hadoop的并行框架,如Hive,Pig,Scalding,Scoobi,Scrunch和Spark,虽然他们声称很简单,但实际上仍然是很复杂的。
Hadoop的响应时间很长,不适用于实时应用。

Storm,Akka,Finagle则更加简单,并且更适合实时应用。

4.Storm

Storm由twitter开发,并在2011年开源。它由Clojure和Java实现,但同时也支持Scala。Storm非常适合用于实时海量数据的统计和分析。
Storm通过一个称为Topology的图来描述流式计算:在一个Topology中,首先通过定义一些Spouts来收集输入数据,在Spout后面是一些Bolts,Bolts可以接收并处理任意Spouts或它前面的Bolts的输出数据,唯一的要求是不能出现环路。

Storm主要特性:
1)Storm封装了各个节点间,以及Bolts间的通讯;
2)维护Bolt的实例数,并平均分配所有Bolt到集群中;
3)在硬件或网络故障时,能很好的恢复;
4)Storm不处理计算任务内部的错误;
5)可以分析Twitter的多种数据
6)可以使用多种语言创建Bolt,因为它使用了thrift(译者:这一点说的不对,多语言支持是通过ShellBolt,原理是通过Std input和Output进行消息交互)
7)原生支持Ruby,Python和Fancy

下面是Storm的一个例子 Word counter,就不再翻译了,感兴趣的可以到Storm网站学习。

5.Akka

Akka 0.6版本在2010年第一次发布。现在版本是2.2,由TypeSafe负责更新维护(Scala也是由该公司更新维护),Akka由Scala和Java实现。

Akka特性:
1)Akka基于Erlang语言,Erlang语言出要用于电信系统,具有很好的并发性和容错机制;
2)Akka可以极大地简化并行处理程序的开发,你需要将任务划分成更小的字任务,这些字任务由大量的actors来处理;
3)可以实现双向通讯;
4)Actor间通过邮箱地址相互通讯,每个Actor都是单线程执行;
5)Akka的原则是:如果有错误,就让他尽早出现;
6)当一个Actor失效时,Akka有多种恢复机制;
7)多个Actor可以共享的访问一个资源,如果cache;
8)Actor是轻量级的,1GB内存中可以创建2700000个Actor;
9)在Akka的线程池中,有一个执行时上下文(execution context);
10)在带宽受限的情况向,Akka工作良好;
11)未来将会实现异步的原子计算;
12)将通过Oz语言引入数据流变量;

应用场景:
1)代理
2)建模
3)社会媒体
4)多人在线游戏
5)金融
6)在线赌博

6.Finagle

Finagle是由Twitter研发,并于2011年开源,它由Scala和Java实现。
Finagle使多种协议通讯成为可能,他实现了RPC Server和Client。

Finagle特性:
1)非常简单的就可以为应用创建Server和Client;
2)服务之间可以远程调用;
3)实现不同协议间的交互,如HTTP,Thrift,Memcashed;
4)server容错;
5)可以基于一个服务,查找其他服务
6)统一的错误处理;
7)统一的重试机制;
8)双向通讯;
9)负载均衡;
10)复杂的原子计算


应用场景:
1)复杂网站,使用多种服务和协议
2)网络爬虫

7.Storm VS Akka

Akka的actor可以实现双向通讯,但你必须维护所有actor的不同状态,Akka的actor更加灵活,但使用复杂。
Storm中stream是预先定义的,从一个Bolt流向另一个Bolt,使用非常简单。

8.Storm vs Finagle

Storm和Finagle都有很好容错机制。
Finagle可以实现双向通讯。
Storm只能实现单向通讯,但是十分简单。

9.Akka vs Finagle

Akka和Finagle都可以实现双向通讯;
Akka中所有东西都是一个Actor(本地或远程),各个Actor之间通讯非常简单。
Finagle相对比较复杂,它别是你要实现不同服务和协议之间的通讯时。

10.三个框架的对象序列化

三个框架都存在对象序列化的问题,因为他们都需要在机器之间传送数据,Java的serialization有以下问题:
1)繁琐
2)无法处理Scala的singleton object

下面是三个Scala的开源库:

    https://github.com/harrah/sbinary
    https://github.com/spray/spray-json
    https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/


11.个人的一些经验

对我来说,尽管作了很多调研,并有一些经验,也很难说使用哪个框架来解决哪个问题。
开始的时候,我在一个数据分析中使用Storm,Storm非常适合,而且十分简单。
后来我转而开始时使用Akka,因为以下几点:
1)很多子系统都是由scala实现的;
2)异步调用第三方服务是会失败;
3)需要启动后台服务;

现在,数据分析中需要使用一些内部或第三方的服务(Scala或其他语言实现),我正在考虑使用Finagle。

12.总结

学习并行处理是一个兴奋得话题,因为并行程序像大脑一样工作,他可以解决我们的协同问题。
我并不知道你如何使用它。
最后:
Storm,Akka,Finagle,MapReduce是不同的并行处理框架,他们都非常有用。

你可能感兴趣的:(storm,akka,finagle)