我最近在Twitter的Storm上工作了一段时间,这让我想知道,它与另一个高性能的并发数据处理框架Akka相比如何 。
什么是Akka和Storm?
让我们从两个系统的简短描述开始。 Storm是一个分布式实时计算系统。 在Storm集群上,您执行拓扑 ,该拓扑处理元组 (数据)流。 每个拓扑都是一个由喷嘴 (生成元组)和螺栓 (转换元组)组成的图形。 Storm负责群集通信,群集之间的故障转移和拓扑分布。
Akka是用于构建分布式,并发,容错应用程序的工具包。 在Akka应用程序中,基本构造是actor ; actor异步处理消息 ,并且确保每个actor实例一次最多使用一个线程运行,这使得并发变得更加容易。 Actor也可以远程部署。 即将提供一个集群模块 ,它将处理集群节点之间的自动故障转移和参与者分配。 两种系统都可以很好地扩展,并且可以处理大量数据。 但是何时使用一个,何时使用另一个?
关于该主题还有另一篇不错的博客文章,但是我想进一步进行比较:让我们看看Storm中的基本构造与Akka中的基本构造相比。
比较基础
首先,Storm中数据的基本单位是元组 。 一个元组可以具有任意数量的元素,每个元组元素可以是任何对象,只要有一个序列化器即可。 在Akka中,基本单元是message ,它可以是任何对象,但也应该可序列化(用于发送给远程参与者)。 因此,这里的概念几乎是等效的。
让我们看一下基本的计算单位。 在Storm中,我们有一些组成部分 : 螺栓和芽 。 螺栓可以是任何代码,它可以对传入的元组进行任意处理。 它还可以存储一些可变数据,例如以累积结果。 此外,螺栓在单个线程中运行,因此,除非您在螺栓中启动其他线程,否则您不必担心并发访问螺栓数据。 这与演员非常相似,不是吗? 因此,暴风雨螺栓/萌芽对应于Akka演员。 这两个如何详细比较? 参与者可以接收任意消息; 螺栓可以接收任意元组。 预计两者都将根据接收到的数据进行一些处理。 两者都具有内部状态,该状态是私有的,并且可以防止并发线程访问。
演员和螺栓:差异
一个关键的区别是角色和螺栓之间的通信方式。 演员可以向任何其他演员发送消息,只要该消息具有ActorRef
(如果没有,则可以按名称查找演员)。 它还可以将回复发送给正在处理的邮件的发件人。 另一方面,暴风雨是单向的 。 您无法发送回邮件; 您也无法将消息发送到任意螺栓。 您还可以将元组发送到命名通道(流),这将导致元组(消息)广播到拓扑中定义的所有侦听器。 (螺栓还会向发短信确认消息,这也是通信的一种形式。)
在Storm中,可以并行运行螺栓/新芽代码的多个副本(取决于并行性设置 )。 因此,这对应于一组(可能是远程的)actor,在它们前面有一个负载均衡器actor 。 这是Akka的选路中众所周知的概念。 关于元组如何路由到Storm中的螺栓实例(随机,字段上的一致性哈希)有两种选择,这大致对应于Akka中的各种路由器选项(循环,消息上的一致性哈希)。
螺栓和演员的“重量”也有所不同。 在Akka,拥有很多演员 (多达数百万)是正常的。 在Storm中,预期的螺栓数量要少得多; 无论如何这都不是Storm的缺点,而是设计上的决定。 同样,Akka角色通常共享线程 ,而每个螺栓实例都倾向于具有专用线程 。
其它功能
Storm还有一个关键功能,即开即用的Akka尚未实现: 保证消息传递 。 Storm跟踪了整个元组树,这些元组树是由发芽产生的任何元组产生的。 如果未确认所有元组,则将重播该元组。
而且,Storm的群集管理更加先进(基于Zookeeper的自动故障转移,群集中工作人员的自动平衡);以及 但是,即将推出的Akka群集模块应该可以解决这个问题。
最后,Storm中的通信布局-拓扑-是静态的,并且是预先定义的。 在Akka中,通信模式可以随时间变化,并且可以完全动态。 actor可以向其他任何actor发送消息,甚至可以发送地址(ActorRefs)。
因此,总体而言,Storm很好地实现了特定范围的用法,而Akka则更多地是通用工具包。 可以在Akka之上构建类似于Storm的系统,但反之则不行(至少很难)。
翻译自: https://www.javacodegeeks.com/2013/06/akka-vs-storm.html