Akka简单的性能测试

简介: 因为最近工作的关系,要把异步任务从应用服务器中拆分到专门的异步处理服务器中.方案一是采用MQ的方式将任务消息发出,在服务端进行处理,如下图所示:Sample Flowchart Template (2).png这种方案是采用MQ作为中间的媒介,在服务端采用线程池异步处理任务,处理完成之后将结果发送到MQ中,客户端采用侦听的方式得到结果继续进行处理。

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

方案一

是采用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。

0A1E14FF-257B-4E91-AB56-A68C6993A80A.png

正在分析性能耗时。

0719FA5C-E435-466A-AA42-07E742D7A9E8.png

服务器整体CPU占比时间为15.9%。

目录
相关文章
|
Java 程序员 Apache
编程语言比拼之Java VS C++
Java和C++都是非常受欢迎的编程语言,各有各的优势和适用场景。以下是对它们的简要比较:
359 0
|
缓存 数据可视化 搜索推荐
Windows 上这些「点一下」就省 N 步的自动化软件,让你的效率快如火箭
Windows 上这些「点一下」就省 N 步的自动化软件,让你的效率快如火箭
1160 0
|
10月前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
308 4
|
SQL XML Java
MyBatis动态SQL------------------choose用法
MyBatis动态SQL------------------choose用法
204 1
|
消息中间件 Java 大数据
"深入理解Kafka单线程Consumer:核心参数配置、Java实现与实战指南"
【8月更文挑战第10天】在大数据领域,Apache Kafka以高吞吐和可扩展性成为主流数据流处理平台。Kafka的单线程Consumer因其实现简单且易于管理而在多种场景中受到欢迎。本文解析单线程Consumer的工作机制,强调其在错误处理和状态管理方面的优势,并通过详细参数说明及示例代码展示如何有效地使用KafkaConsumer类。了解这些内容将帮助开发者优化实时数据处理系统的性能与可靠性。
255 7
|
存储 SQL 分布式计算
Velox表达式计算原理调研
velox是Meta开源的高性能的C++计算引擎,本文主要来调研下其表达式计算的实现原理。
1301 3
成功解决smtplib.SMTPAuthenticationError: (535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb
成功解决smtplib.SMTPAuthenticationError: (535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb
|
机器学习/深度学习 算法 Python
探索XGBoost:参数调优与模型解释
探索XGBoost:参数调优与模型解释
676 2
|
自然语言处理 达摩院 搜索推荐
阿里推出文本搜索排序新技术,登顶国际权威NLP榜单MS MARCO
3月28日,阿里巴巴团队以0.450的得分,刷新了国际权威自然语言处理(NLP)榜单MS MARCO短文本检索排序任务历史纪录。据悉,搜索团队最新研发的文本检索及排序技术已通过阿里云智能开放搜索OpenSearch产品对外输出。
1366 0
阿里推出文本搜索排序新技术,登顶国际权威NLP榜单MS MARCO