使用Akka處理1000萬條消息

Akka演員承諾并發。 有什么更好的模擬方式,看看使用商品硬件和軟件處理1000萬條消息需要花費多少時間,而無需進行任何低級調整。我用Java編寫了整個1000萬條消息的處理過程,整個結果令我驚訝。

當我在具有Intel i5 – 4核,4 Gb RAM計算機和JVM堆的iMac計算機上以1024Mb運行該程序時,該程序在23秒內處理了1000萬臺計算機。 我多次運行該程序,平均時間為25秒。 因此,我收到的吞吐量幾乎在每秒40萬條消息的范圍內,這是驚人的。

下圖說明了用于模擬負載生成方案的流程。

警告:每條消息在1秒鐘后發送響應,這對于實際情況而言并非正確的模擬。 在這種情況下,消息處理將消耗堆和gc活動上的一些資源,這些資源未考慮在內。

該程序使用了Akka發布者的總體指導:在75秒內處理了1000萬條消息(每條消息1秒)! 盡管沒有任何限制。

該程序的代碼庫位于以下位置– https://github.com/write2munish/Akka-Essentials

ApplicationManagerSystem創建actor,并在到WorkerActor的流量中進行泵送

private ActorSystem system;private final ActorRef router;private final static int no_of_msgs = 10 * 1000000;public ApplicationManagerSystem() {final int no_of_workers = 10;system = ActorSystem.create('LoadGeneratorApp');final ActorRef appManager = system.actorOf(new Props(new UntypedActorFactory() {public UntypedActor create() {return new JobControllerActor(no_of_msgs);}}), 'jobController');router = system.actorOf(new Props(new UntypedActorFactory() {public UntypedActor create() {return new WorkerActor(appManager);}}).withRouter(new RoundRobinRouter(no_of_workers)));}private void generateLoad() {for (int i = no_of_msgs; i >= 0; i--) {router.tell('Job Id ' + i + '# send');}System.out.println('All jobs sent successfully');}

一旦WorkerActor收到了消息,則計劃將響應在1000毫秒后發送

public class WorkerActor extends UntypedActor {private ActorRef jobController;@Overridepublic void onReceive(Object message) throws Exception {using scheduler to send the reply after 1000 millisecondsgetContext().system().scheduler().scheduleOnce(Duration.create(1000, TimeUnit.MILLISECONDS),jobController, 'Done');}public WorkerActor(ActorRef inJobController) {jobController = inJobController;}}

來自WorkerActor的響應消息被發送到JobControllerActor,后者收集所有響應。

public class JobControllerActor extends UntypedActor {int count = 0;long startedTime = System.currentTimeMillis();int no_of_msgs = 0;@Overridepublic void onReceive(Object message) throws Exception {if (message instanceof String) {if (((String) message).compareTo('Done') == 0) {count++;if (count == no_of_msgs) {long now = System.currentTimeMillis();System.out.println('All messages processed in '+ (now - startedTime)  1000 + ' seconds');System.out.println('Total Number of messages processed '+ count);getContext().system().shutdown();}}}}}

參考: 教程:Hibernate,JPA和Spring MVC –來自Akka Essentials博客的JCG合作伙伴 Munish K Gupta的第2部分 。


翻譯自: https://www.javacodegeeks.com/2012/05/processing-10-million-messages-with.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372460.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP中unset,array_splice刪除數組中元素的區別

php中刪除數組元素是非常的簡單的,但有時刪除數組需要對索引進行一些排序要求我們會使用到相關的函數,這里我們來介紹使用unset,array_splice刪除數組中的元素區別吧 如果要在某個數組中刪除一個元素,可以直接用的unset,但是數組的…

dart服務器開發性能,DartVM服務器開發(第四天)--代碼優化

優化請求上一篇文章中,我們通過依賴第三方http_server這個包實現將html頁面返回給瀏覽器,但是一般的服務器都包含請求html,json格式的傳遞,這樣就有可能造成了混亂,下面我們使用http_server這個包進行優化吧&#xff0…

JBox2D和JavaFX:事件與力量

在昨天的示例中,您看到了如何創建一個簡單的世界并使用WorldView進行顯示,以及如何提供自定義渲染器。 現在,我們將添加一些用戶輸入。 我們將創建一個類似于彈球機中的鰭狀肢的控件。 為此,我們將創建一個關節。 在JBox2D中&…

【Android】SVG和VectorDrawable——相關格式轉換

SVG是矢量圖,剛接觸尚不能仔細介紹,但只需記得一點:放大不失真,存儲也方便。 因為多數戶型圖使用SVG格式,Android要用的話必須通過相關轉換工具,將原SVG格式文件,轉換為XML后綴的VectorDrawable…

服務器時間維護制度,網絡設備及服務器日常維護管理制度

第一章總則第一條:為保證機房設備與信息的安全,保障本校服務器及網絡系統在良好、穩定、高效、快速的安全運行。特制定本制度。第二條:為確保中心機房網絡設備特別是服務器安全,根據崗位職責設立機房管理員,負責對機房…

SELinux入門簡介

操作系統有兩類訪問控制:自主訪問控制(DAC)和強制訪問控制(MAC)。標準Linux安全是一種DAC,SELinux為Linux增加了一個靈活的和可配置的的MAC。 進程啟動時所擁有的權限就是運行此進程的用戶權限,…

RESTEasy教程第3部分:異常處理

在開發軟件應用程序時,異常處理是顯而易見的要求。 如果在處理用戶請求時發生任何錯誤,我們應該向用戶顯示一個錯誤頁面,其中包含詳細的異常消息,錯誤代碼(可選),更正輸入和重試的提示&#xff…

WinForm關閉窗體徹底的退出方式

//System.Environment.Exit(0); //Process.GetCurrentProcess().Kill(); //System.Threading.Thread.CurrentThread.Abort(); System.Diagnostics.Process.GetCurrentProcess().Kill();Application.Exit(); 轉載于:https://www.cnblogs.com/XuPengLB/p/5799178.html

創建css的時候選擇器有哪幾類,CSS3-CSS的選擇器共有幾類?

CSS 3對屬性選擇器的又增加了3種子字符串的匹配方式:E[att^"val"]匹配所有E元素中att屬性的值以“val”開始的所有元素。E[att$"val"]匹配所有E元素中att屬性的值以“val”結束的所有元素。E[att*”val”]匹配所有E元素中att屬性的值中包含字符…

在Grails 2.0中使用Servlet 3.0異步功能

上周,我與某人談論了Grails 2中對Servlet 3.0異步功能的新支持,并意識到我對可用功能并不了解。 所以我想我會嘗試一下并分享一些例子。 該文檔對這個主題有些了解,因此首先介紹一些背景信息。 在3.0規范中進行異步工作的主要方式是javax.ser…

接口怎么實例化?

最開始看到數據庫連接的時候忽然想到這個問題: Connection connull;try {Class.forName(Driver);} catch (ClassNotFoundException e) {e.printStackTrace();}try {conDriverManager.getConnection(url, user, pass);} catch (SQLException e) {e.printStackTrace()…

css中基線指的是哪一條線,如何設置基線網絡_CSS, Vertical Rhythm 教程_W3cplus

首先,當談到排版,我們先要了解基線是什么?維基百科是這樣定義)的:在排版和書法中,基線是以字終sit底線為基礎,并且向兩邊延伸的直線。好極了,但我為什么要忽視他呢?好希望你充滿激情…

libvirt里的面向對象的C語言

C語言:類的聲明和定義 1 // 通用父類的定義2 struct _virClass {3 virClassPtr parent;4 5 unsigned int magic;6 char *name;7 size_t objectSize;8 9 virObjectDisposeCallback dispose; 10 }; 11 typedef struct _virClass virClass; 12 typ…

使用JGroups進行ElasticMQ消息復制

ElasticMQ是一臺消息服務器,具有Scala,Java和與Amazon SQS兼容的接口。 它通過跨服務器群集復制消息來支持有保證的消息傳遞,并通過日志記錄實現消息持久性。 消息復制是ElasticMQ的核心功能之一。 但是,如果您看一下代碼&#xf…

ajax省市二級聯動硬編碼,AJAX請求接受硬編碼的JSON,但不接受軟編碼

這個AJAX請求返回'成功'如果PHP中的輸出被復制并粘貼了JSON,但是'失敗'如果它是由文件生成的。看看下面api.php中的評論,看看我的意思。$.aj…

Fiddler高級技巧 - 映射路徑到本地文件夾

適用場景: 你是前端開發人員,要開發一個小模塊,需要用到線上的環境(賬號、數據、跨域等),但你又沒有權限往線上傳文件你是移動測試人員,需要將一組接口的返回結果替換為另一組,最簡單…

Spring Social入門

像我一樣,無論是添加簡單的Facebook“贊”按鈕,一大堆“共享”按鈕還是顯示時間軸信息,您都不會注意到當前對應用程序“社交化”的熱衷。 每個人都在做這件事,包括Spring的家伙,事實上,他們提供了一個稱為S…

apache ajax 跨域訪問,Apache 實現AJAX跨域請求

當使用ajax跨域請求時,瀏覽器報錯:XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin.肯定是跨域的問題,如果用jsonp或者pro更多:當使用ajax跨域請求時,瀏覽器報錯:XmlHtt…

14、數據庫

數據庫轉載于:https://www.cnblogs.com/quyong/p/6687924.html

EhCache復制:RMI與JGroups

最近,我正在研究一種需要復制緩存的產品。 緩存提供程序已經確定-EhCache,剩下的就是有關傳輸的問題。 哪一個是最佳選擇? 這里的最佳選擇是指性能更好的選擇。 僅在兩個可用傳輸之間進行了性能評估-JGroups和RMI,對其他傳輸不予考…