由於最近工做的關係,要把異步任務從應用服務器中拆分到專門的異步處理服務器中.java
是採用MQ的方式將任務消息發出,在服務端進行處理,以下圖所示:安全
Sample Flowchart Template (2).png服務器
這種方案是採用MQ做爲中間的媒介,在服務端採用線程池異步處理任務,處理完成以後將結果發送到MQ中,客戶端採用偵聽的方式獲得結果繼續進行處理。多線程
這種方案的不足是,可能在某些需求的狀況下,須要將結果存放到共享的HashMap或者Threadlocal中進行存放結果,客戶端會一直阻塞,直到獲得結果,從多線程的角度來講,仍是用了共享變量,雖然共享變量多是線程安全的,可是從併發模型的角度來說,並非一個最好的方式。併發
採用比較流行的Akka框架來實現。
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 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。