Akka简单性能分析

标签: akka | 发表时间:2016-02-28 20:28 | 作者:小程故事多
出处:http://ifeve.com

因为最近工作的关系,要把异步任务从应用服务器中拆分到专门的异步处理服务器中。

方案一

是采用MQ的方式将任务消息发出,在服务端进行处理,如下图所示:

Sample Flowchart Template (2).png

这种方案是采用MQ作为中间的媒介,在服务端采用线程池异步处理任务,处理完成之后将结果发送到MQ中,客户端采用侦听的方式得到结果继续进行处理。

这种方案的不足是,可能在某些需求的情况下,需要将结果存放到共享的HashMap或者Threadlocal中进行存放结果,客户端会一直阻塞,直到得到结果,从多线程的角度来说,还是用了共享变量,虽然共享变量可能是线程安全的,但是从并发模型的角度来讲,并不是一个最好的方式。

方案二

采用比较流行的Akka框架来实现。
Akka的五大特性

  • 易于构建并行和分布式应用
  • 可靠性(Resilient by Design)
    系统具备自愈能力,在本地/远程都有监护。
  • 高性能(High Performance)
    在单机中每秒可发送50000000个消息。内存占用小,1GB内存中可保存2500000个actors。
  • 弹性,无中心(Elastic — Decentralized)
    自适应的负责均衡,路由,分区,配置
  • 可扩展(Extensible) 可以使用Akka 扩展包进行扩展。

因为之前一直研究Scala,Scala的多线程处理的性能是非常高的,那基于Scala语言而开发出来的Akka框架得到了广泛使用。那么接下来我将使用一个非常简单的例子,以及一些测试用例展现一下它的性能。
代码如下:

  import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;

/**
 * PROJECT_NAME: akkademo
 * DATE:         16/2/27
 * CREATE BY:    chao.cheng
 **/
public class ToStringActor extends UntypedActor {
    @Override
    public void onReceive(Object message) {
        System.out.println(message.toString());
        try {
            Thread.sleep(500);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("toStringActor");
        final ActorRef toString = system.actorOf(Props.create(ToStringActor.class),"toString");
        for(int i=0;i<10000000;i++) {
            toString.tell("test"+i,toString);
        }
        System.out.println("[结束]=======================");
    }
}

程序的简单说明:
采用事件的机制,循环发送一千万条数据,通过onReceive方法异步处理任务。

用VisualVM工具截图可以看到:

DFF8C31B-3886-4F75-A56B-EA78F85A6067.png

后台其实自适应只起了三个线程在运行,分别是dispatcher-2,dispatcher-3,dispatcher-4。

原创文章,转载请注明: 转载自 并发编程网 – ifeve.com

本文链接地址: Akka简单性能分析

相关 [akka 性能分析] 推荐:

Akka简单性能分析

- - 并发编程网 - ifeve.com
因为最近工作的关系,要把异步任务从应用服务器中拆分到专门的异步处理服务器中. 是采用MQ的方式将任务消息发出,在服务端进行处理,如下图所示:. 这种方案是采用MQ作为中间的媒介,在服务端采用线程池异步处理任务,处理完成之后将结果发送到MQ中,客户端采用侦听的方式得到结果继续进行处理. 这种方案的不足是,可能在某些需求的情况下,需要将结果存放到共享的HashMap或者Threadlocal中进行存放结果,客户端会一直阻塞,直到得到结果,从多线程的角度来说,还是用了共享变量,虽然共享变量可能是线程安全的,但是从并发模型的角度来讲,并不是一个最好的方式.

java 协程 实现 Akka

- - zzm
Akka是开源的,可以通过Apache 2许可获得. 可以从 http://akka.io/downloads/ 下载.         对并发/并行程序的简单的、高级别的抽象.         异步、非阻塞、高性能的事件驱动编程模型.         非常轻量的事件驱动处理(1G内存可容纳约270万个actors).

Akka 和 Storm 的设计差异

- - zzm
Akka 和 Storm 的设计差异. Akka 和 Storm 都是实现低延时, 高吞吐量计算的重要工具. 如果说 Akka 是 linux 内核的话, storm 更像是类似 Ubuntu 的发行版.然而 Storm. 并非 Akka 的发行版, 或许说 Akka 比作 BSD, Storm 比作 Ubuntu 更合适..

分布式应用框架Akka快速入门

- - CSDN博客架构设计推荐文章
转载请注明出处: http://blog.csdn.net/jmppok/article/details/17264495. 本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明. Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用.

Akka Cluster 2.3.1 bug分析和相关实现原理

- - 开源软件 - ITeye博客
       Akka这样一个scala世界里的明星,给我们提供了各种各样吸引人的功能和特性,尤其在分布式、高并发领域. 但就像任何其他优秀的框架,它的实现也必然会有其复杂性,在Roland Kuhn(Akka Tech Lead)的带领下,Akka的实现原理吸收了各个领域内成熟、领先的理论. 尤其是Akka里cluster的实现,更是体现了非常多的优秀理论和实战经验.

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

- - CSDN博客云计算推荐文章
本文翻译自: http://blog.samibadawi.com/2013/04/akka-vs-finagle-vs-storm.html. Storm Akka Finagle对比及使用场景分析. Storm、Akka、Finagle是三个开源的分布式并行处理框架,都基于JVM运行. 他们在解决下面这些问题上十分有用:.

Android应用性能 分析

- - CSDN博客推荐文章
  其实主要是内存方面,内存管理是个永恒的话题. 1.从工具DDMS中,在Sysinfo的tab栏里面有一个Memory usage的选项,通过USB连接Android设备以后很容易抓到图. 在图中可以看到系统随时可以用的内存是Free和Buffers两项,因为我抓图的系统只有128M的内存,所以看上去这部分可用内存已经很少了.

lucene MoreLikeThis性能分析

- - 七磅-d0evi1
最近使用lucene的MoreLikeThis实现一个小型的推荐系统. 语料由短文本构成,本身也还算比较中小等规模:7000w左右(亿级别)的数据量,3G大小的文件. 对需要的Field建完索引后的索引文件大小在4G左右. 本文只是结合自己的实践列出一些注意事项,以做为参考. 一、MoreLikeThis实现原理.

leveldb性能分析和表现

- Adam - Erlang非业余研究
原创文章,转载请注明: 转载自Erlang非业余研究. 本文链接地址: leveldb性能分析和表现. Leveldb是一个google实现的非常高效的kv数据库,目前的版本1.2能够支持billion级别的数据量了. 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计. 那么数据库最怕的的随机IO他是如何解决的呢.

分布式事务性能分析

- wangdei - 风轻扬
这两年来,随着NoSQL系统、CAP理论和Eventual Consistency的大热,关于分布式操作要保证强一致还是弱一致性的讨论络驿不绝. 双方各执一词,倾向实现强一致性的一方认为弱一致性满足不了应用开发的需要,倾向实现弱一致性的一方则认为保证强一致性将导致系统性能与可伸缩性难以接受. 弱一致性能否满足应用开发的需求这一点由应用特征决定,难以一概而论,但强一致性对系统性能、可伸缩性和可用性的影响则是可以作技术分析的.