Akka与Storm对比

Akka vs Storm

简短的描述一下这两个系统: Storm是一个分布式的,实时计算系统。在一个Storm集群中,通过执行的topology,实现处理tuples数据流。每个拓扑由Spout(产生tuple)和Bolt(转换tuple)。Storm需要关注集群通信,故障切换和分配群集节点间的拓扑。

Storm详细介绍

AKKA是一个工具包,用于构建分布式,并发,容错的应用。在一个akka应用,基本结构是一个Actor,actor异步地处理消息,并保证每个actor实例运行使用的时间,最多只有一个线程,这样并发实现容易得多。actor也可以远程部署。有一个集群模块,能处理自动故障切换和Actor群集节点间的分布。

Akka详细介绍

这两个系统规模非常好,可以处理大量的数据。但是,何时使用,何时使用?

Storm的tuple和Akka的message两者概念几乎相差不多。

Storm的Bolt以单线程运行,除非你在Bolt中启动新的线程,因此不必担心并发访问你,这和类似Actor,Storm的bolt/sprout相当Akka的actor,两个都有内部状态,都是私有的,在线程并发访问时受保护的。

那么Actors和bolts区别是什么?

明显区别是两者的联系方式,Actor是发送消息给另外Actor,只要它有一个ActorRef,如果没有根据名称查找,它也发回消息给之前发送者,而Storm是单边的one-way,你不能发送回消息,你能发送tuple给一个命名的Stream通道,将tuple广播到所有监听者,这些都是在topology中定义。

在Storm中,多个Bolt/Sprout代码的拷贝能并行运行,当然取决于并行设置,而对于一系列Actors,有一个负载平衡Actor在他们前面,也就是Akka的routing,在Storm中tuple如何路由到bolt有很多选择,而Akka也是有多个选项,如round robin 消息一致哈希等等。

bolt和actor在重量上有区别,actors可以有很多,而storm中bolt数量明显少,并不是其缺点,而是设计决定的,Akka的actors是共享线程,而bolt实例都是有一个定制线程。

其他特性:
Storm有一个重要特性是Akka没有实现的, guaranteed message delivery确保消息传递,Storm跟踪整个tuple树,从原始到最后,如果所有的tuple没有完成,将重新播放。

Storm集群管理也是更高级,自动容错 自动负载平衡,基于zookeeper。

最后,Storm的通讯布局,也就是topology是静态的,而akka的通讯能时刻改变,是动态的。

Storm执行特定用途很好,而akka是通用的工具包,也可能基于akka建立类似storm的系统。也许比较难

虽然Storm和akka都是基于事件驱动的,他们工作原理非常相似,主要区别还是其架构决定的, Storm是一个完整分布式系统,而Akka是可以手工构建分布式系统。

构建一个分布式系统是要遵循一些规则,比如数据的切分和复制,时钟和确保事件顺序性。

遵循这些原则使用Akka手工构建类似Storm的系统,有可能更加符合业务特点,而且底层基础结实。

参考ScalaStorm作者写的Akka结合Storm产品化经验:http://www.jdon.com/45871

[该贴被banq于2013-11-12 14:10修改过]

banq 你好,
看了你的Match的例子,我有个疑问,为什么事件的产生和处理都要在聚合根Match上进行呢?为什么不能聚合根是聚合根,事件的产生和处理分开进行呢?

@zfs 你好,事件的产生和处理也就是producer和consumer应该分开的。这个问题不适合在这个主题下讨论,跑题了。可另开帖。

新贴在这,请banq移步http://www.jdon.com/45874#23143800