Akka 对比 Storm

转载请注明出处:http://blog.csdn.net/jmppok/article/details/17267585


原文地址:http://www.warski.org/blog/2013/06/akka-vs-storm/

Akka 对比 Storm
最近在工作中用到Twitter的Storm框架,于是将他与另外一个高性能,数据并行处理框架Akka进行了对比.

1.什么是Akka和Storm

首先对两个系统进行一个简单的介绍:
Storm是一个分布式实时刘计算框架。在Storm集群中运行的是各个Topology,而在Topology中,数据已Tuples的形式流动。(从Topology的一个Bolt流动到另一个Bolt,流动的逻辑由topology控制)。Topology包括Spouts和Bolts两部分,其中Spout产生数据,Bolt处理数据。Storm封装了集群节点间的通讯,故障处理以及topology在集群中的分布式运行,你只需要开发自己的Spout和Bolt,并将其组成一个Topology既可。
Akka是一个用于构建分布式,并行和容错应用的开发框架,在Akka应用中,基本单元是actor,actor之间通过异步消息进行通讯。每个actor同时只有一个线程运行,从而使并发变得十分容易。同时actors也可以部署到远程运行。Akka正在开发一个集群模块,该模块将可以自动将actors部署到Akka集群中,并可以自动进行故障处理。

两个系统都具有很好的伸缩性,并能处理海量数据,但我们应用在什么场景使用哪种系统呢?这个问题由另外一篇文章进行说明:http://blog.samibadawi.com/2013/04/akka-vs-finagle-vs-storm.html
这里我们先对Akka和Storm进行一个全面的对比。

2.基本概念对比

1)基本数据单元

storm中数据的基本单元是tuple,tuple类似一个map结构,它可以有多个元素,每个元素可以是任意类型,tuple本身是可序列化的。
而在Akka中,基本的数据单元是消息(message),消息可以是任意的数据类型,并且可以被序列化,从而可以被发送给其他的actors。
在基本数据单元这一点上他们基本是相同的。

2)基本计算单元

在storm中,基本计算单元包括spouts和bolts。其中spout产生数据,bolt处理数据。Bolt可以包含任何处理代码用于处理到来的tuples,也可以存储中间数据。每一个Bolt都由一个单独的线程运行,如果你没有在Bolt中启动额外的线程,你就不必关心线程的并发问题,这一点上和akka的actor比较相似。这是Storm spout/bolt和akka actor在概念上的对比,他们的处理流程的对比如下:
Actors可以接收任意的消息;Bolts可以接收任意的tuple;他们都对受到的数据进行某种处理。
他们内部都保存处理的状态,这些状态对多线程访问是安全的。(不懂,上面好像说他们都是单线程执行的)。

3)Actors和Botls的区别

actors和bolts最大的区别在于他们的通讯方式。
actor可以向任意的actor发送消息(通过ActorRef,如果没有ActorRef,也可以通过actor的名字查找)。并且actor可以给向他发送消息的actor返回应答消息。而这在storm中是不可能的,storm中的tuple是单向流动的,你不能返回消息,也不能向任意的Bolt发送消息消息的流动路径是在Topology中已定义好的,你通过可以通过一个命名管道(stream)发送tuple,tuple会被发送给所有的监听者。(Bolt也可以向acker发送消息)

在Storm中,Spout/Bolt代码会被根据并行数拷贝多份,由不同的线程执行,这点与akka类似。在Akka中,可以通过一个负责均衡actor管理多个actors实现actor的并行。同时,Storm中tuple的传递方式有多种选择(随即,基于field的分割等),这点akka也可以通过router实现,router具备轮转、哈希等多种策略。

另外Storm的bolt和actor的“数量”也有不同,在Akka中,actor的数量可以成千上万,而Storm中则Bolt的数量则要少得多。但这并不是Storm的缺点,而是设计上的一个决策。Akka中actors共享线程,而在Storm中,每一个Bolt都有单独的线程。

3.其他方面的对比


a.storm具备一个Akka所不具备的重要的特性:消息传输的可靠性。Spout所发出的每一个tuple 都会被Storm框架追踪,当发现该tuple没用正常处理时,spout就会重发这个tuple。

b.storm具备更好的集群管理机制,基于Zookeeper实现了自动故障转移,自动负载均衡等。Akka将在后续的集群模块中实现这些功能。

c.最后,Storm的数据流动路径是在Topology中提前定义好的,而在Akka中,消息通讯是动态的,actors可以根据地址,和任意的actors通讯。

4.总结

Storm实现了一个实时的流处理框架,可以支持不同的应用;而Akka更像是一个开发库,用户可以基于Akka开发其自己的系统,如实现一个Storm,当然,这有难度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Akka是一个基于Actor模型的并发编程框架,它提供了一种简单而强大的方式来处理并发编程和分布式系统。WebSocket是一种在客户端和服务器之间进行双向通信的协议。而wss是WebSocket***可以通过akka-http模块来实现。akka-http提供了一套灵活的工具和API来处理HTTP和WebSocket请求。 要在Akka中使用WebSocket over SSL(wss),你需要做以下几步: 1. 配置SSL证书:你需要生成和配置一个SSL证书,可以使用自签名证书或者购买一个由可信机构签名的证书。 2. 导入依赖:确保你的项目中导入了akka-http和akka-stream依赖。 3. 创建WebSocket路由:使用akka-http的路由DSL创建一个WebSocket路由。你可以定义处理WebSocket消息的逻辑,比如收到消息时的处理和发送消息给客户端等。 4. 启动HTTP服务:创建一个HTTP服务器,并将WebSocket路由添加到路由器中。 下面是一个简单示例,演示了如何在Akka中使用WebSocket over SSL: ```scala import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.ws.{Message, TextMessage} import akka.http.scaladsl.server.Directives._ import akka.stream.ActorMaterializer import akka.stream.scaladsl.{Flow, Sink, Source} import scala.concurrent.ExecutionContext.Implicits.global object WebSocketServer { def main(args: Array[String]): Unit = { implicit val system = ActorSystem("websocket-system") implicit val materializer = ActorMaterializer() val route =

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值