Akka簡單的性能測試

由於最近工做的關係,要把異步任務從應用服務器中拆分到專門的異步處理服務器中.java

方案一

是採用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工具截圖能夠看到:ide

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


後臺其實自適應只起了三個線程在運行,分別是dispatcher-2,dispatcher-3,dispatcher-4。

 

正在分析性能耗時。

服務器總體CPU佔比時間爲15.9%。


 

文/小程故事多(簡書做者) 原文連接:http://www.jianshu.com/p/6d62256e3327 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。

相關文章
相關標籤/搜索