1. 程式人生 > >Akka簡單的效能測試

Akka簡單的效能測試

因為最近工作的關係,要把非同步任務從應用伺服器中拆分到專門的非同步處理伺服器中.

方案一

是採用MQ的方式將任務訊息發出,在服務端進行處理,如下圖所示:
這裡寫圖片描述
這種方案是採用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工具截圖可以看到:

這裡寫圖片描述
後臺其實自適應只起了三個執行緒在執行,分別是dispatcher-2,dispatcher-3,dispatcher-4。

這裡寫圖片描述
正在分析效能耗時。

這裡寫圖片描述
伺服器整體CPU佔比時間為15.9%。