将涡轮增压器添加到JEE Apps

我扮演的关键角色之一是在本地社区中传播Akka。 作为讨论的一部分,人们通常会想到的问题/疑问是Akka如何针对编写良好的Java / JEE应用程序提供更好的可伸缩性和并发性。

由于底层硬件/ JVM保持不变,因此参与者模型如何比传统的JEE应用程序发挥更多的功能? 为了展示怀疑者,我们决定在现有的JEE Web应用程序中进行小型测试,对业务逻辑进行重新建模以利用参与者模型,并对该模型进行测试。

日交易者应用

DayTrader是围绕在线股票交易系统范例构建的基准应用程序。 该应用程序允许用户登录,查看其投资组合,查找股票报价以及买卖股票。 DayTrader不仅是功能测试的出色应用程序,而且还提供了一组标准的工作负载,用于表征和衡量应用程序服务器和组件级别的性能。
DayTrader建立在一套核心的Java EE技术上,该技术包括用于表示层和Java数据库连接(JDBC)的Java Servlet和JavaServer Page(JSP),Java消息服务(JMS),企业JavaBeans(EJB)和消息驱动Bean (MDB)用于后端业务逻辑和持久层。 有关DayTrader的更多信息,请点击这里 。 DayTrader似乎是测试我们理论的应用的合适之选。 我们决定使用JSP-> JDBC模型来使事情保持简单和可比性。 我们采用了2个用例,并对业务逻辑进行了重新建模以使用TypedActors。

场景1 –报价/交易屏幕–获取报价

在DayTrader应用程序的“报价/交易者”屏幕中,有一个工具,可通过单击“报价”按钮来选择报价列表的详细信息。 该股票的报价将被检索并显示给用户。

在标准流程中,获取报价请求由专用的TradeAction处理,该TradeAction在内部调用TradeDirectJEEE对象的getQuote()接口。 对于每个请求,都会创建一个TradeAction对象。

在更新的流程中,创建了一组工作人员角色,它们侦听来自各个模块的请求以获取报价详细信息。 TradeActionManager将在开始时创建Typed actor池,并且还将执行将传入请求路由到Typed actor的操作,Typeed actor包含TradeAction对象以调用getQuote函数。 由于使用了类型化角色,因此相同的TradeActionManager可以在现有应用程序中进行最小的更改的情况下满足其他TradeAction调用。

原始和修改后的DayTrader应用程序都由20个,50个,75个和100个Typed actor以及许多Trade Action对象执行。

该图显示了每种测试方案的相对吞吐量,深红色的长条表示原始应用程序的吞吐量值,其他长条表示不同角色池大小的Akka应用程序的吞吐量。

  • Akka Typed Actor的每秒吞吐量比原始DayTrader应用程序(对于较大的actor池大小)要好,并且具有较少的内存使用(尤其是700和300个用户*每个请求2个)。
  • 原始应用程序需要额外的168 MB来处理1400个请求(700个用户,每个请求2个请求),而对于Typed Actor池大小为50个actor的修改后的应用程序,用于服务相同类型请求量的额外内存被观察为104 MB, 提高了38% 。 对于75和100个类型的actor,观察到额外的内存使用量在126MB-136MB之间。

该图显示了每种测试方案的相对吞吐量,深红色的条表示原始应用程序的吞吐量值,其他条表示不同的参与者池大小使用Akka的应用程序的吞吐量。

使用Jmeter对获取报价的呼叫模拟是在相同的高负载条件下,分别针对300个用户,分别针对100个和200个演员的不同系统和Akka设置进行的,大约需要45分钟。

  • 已观察到,在相同条件下,相对于原始应用程序,将Typed Actor的数量从100增加到200相对可以将吞吐量提高约15%和18%。
  • 还可以观察到,将堆大小增加到1024 MB,并将垃圾回收方法更改为并发标记清除,有助于提高高负载条件下的吞吐量。

方案2 – 4个屏幕–登录,主页,获取报价,购买

尝试了一个由4个用户屏幕组成的更复杂的用例,其中用户将使用四个步骤来完成用例场景。 四个步骤是

  1. 用户通过登录页面登录
  2. 提交登录凭据后,向用户显示主页。
  3. 获取股票的报价,其符号由用户在主页屏幕上输入。
  4. 在每个符号下方提交要购买的数量后,购买股票。

所有请求都使用TradeAction对象为请求提供服务。 TradeAction对象实现TradeService接口。 因此,在这种情况下,也应用了为报价/交易屏幕实现的相同TypedActor模型–在上一种情况下确定的“获取报价”业务情景,而且在TradeAction模块中几乎没有或没有任何更改。

使用Jmeter对包含四个屏幕的用例进行了模拟,为300个具有不同Typed Actor池大小的用户创建了用例。 用户数量设置为在60秒内增加到最多300个用户,并且测试运行了15分钟。

可以观察到,将actor的数量从0增加到300可将吞吐量提高大约8%。

超过300个Typed actor的任何增加都显示出较小的改进。

与原始应用程序的内存使用量相比,使用相同类型的actor的应用程序的峰值内存使用率在相同吞吐量(100个类型化的actor)的情况下提高了约30-40%。

结论

即使进行了简单的更改,运行在标准笔记本电脑上的应用程序仍能够提供更好的吞吐量( + 8% ),并且整体内存使用率下降了38% ,这表明actor模型的效率以及Akka对内存和线程的处理。

测试环境详情

  • 处理器– Intel Core i5-2410M CPU @ 2.30 GHz
  • 内存– 4 GB
  • 操作系统– Windows 7 Enterprise
  • 应用程序服务器– Apache Geronimo v2.2.1
  • 编译器和构建工具– Apache Maven v2.2.1
  • Java版本– 1.7.0_03
  • Akka版本– Akka 2.0.2
  • 数据库– Apache Derby

我们可以做的其他优化:

  • 基于请求模式进行分组的Akka未类型化参与者池。 说一个小池仅满足不那么频繁使用的请求,而一个大池(或多个池)满足更频繁使用的请求(例如获取报价或获取帐户)。 可以基于请求模式更改池大小的比率,以获得更好的吞吐量。
  • 使用actor的PreStart和PostStart函数为数据库添加初始化任务,例如获得连接和关闭连接或任何其他初始化任务。
  • Akka无类型演员,用于并发处理持股,同一帐户和会话的多个报价。
  • 使用Akka actor层次结构,以便有多个级别的actor,而更高级别的supervisor actor将一个任务划分为较小的子任务,并委派给下一级别的子actor。
  • 优化actor系统的Akka调度程序线程池大小。

我想对我的同事Chintu Vijay表示感谢,他进行并运行了测试。

参考: Akka Essentials博客上的JCG合作伙伴 Munish K Gupta 向JEE Apps添加了涡轮增压器 。

翻译自: https://www.javacodegeeks.com/2013/01/adding-turbochargers-to-jee-apps.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python package_python之package定义

一.简单说明 python是通过module组织代码的,每一个module就是一个python文件,但是modules是通过package来组织的。我们平时在简单测试的时候 一般就是几个Python文件存放在同级的目录下,但是当我们开始尝试开发更为复杂的项目时,p…

html 手机端无法拖动地图,关于腾讯地图api的禁止地图拖动问题

禁用滚动和拖动*{margin:0px;padding:0px;}body, button, input, select, textarea {font: 12px/16px Verdana, Helvetica, Arial, sans-serif;}p{width:603px;padding-top:3px;overflow:hidden;}.btn{width:142px;}#container{min-width:600px;min-height:767px;}//初始化函数…

《一起》个人进展——Day07

昨天做了些什么:实现登录界面的美化 今天的计划:还是准备进行与其他界面的融合 遇到的困难:代码了解不够,融合起来会出现bug转载于:https://www.cnblogs.com/gxt-/p/6828131.html

epoll nio区别_【总结】两种 NIO 实现:Selector 与 Epoll

我想用这个话题小结下最近这一阶段的各种测试和开发。其实文章的内容主要还是想总结一下NIO Socket,以及两种不同操作系统实现NIO的方式,selector和epoll。问题应该从服务器端开始说起。我们都写过net包下的socket,用socket的accept方法来等待…

MapReduce的工作原理

一、MapReduce模型框架 MapReduce是一个用于大规模数据处理的分布式计算模型,最初由Google工程师设计并实现的,Google已经将完整的MapReduce论文公开发布了。其中的定义是,MapReduce是一个编程模型,是一个用于处理和生成大规模数据…

react实现多行文本超出加省略号

http://www.css88.com/archives/5206 overflow : hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; 根据该文章方法,放在react项目中发现并不能实现,仔细观察发现原来react解析出来的css样…

Google Guava MultiMaps

番石榴 这是系列文章中的第一篇,我将尝试解释和探索Google很棒的Guava java库 。 我在搜索Apache Commons Collections的通用版本时遇到了番石榴(Guava)–我需要一个Bimap并且厌倦了必须使用强制类型转换来填充我的代码–但是我发现要好得多…

qq群 html,我的群组-普通群组.html

我的群组-普通群组$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resou…

查看PLC IP 端口_西门子828D数控系统X130接口通讯怪异现象(X130手动设置的 IP)...

西门子828D数控系统,调试PLC过程中遇到网络通信怪异问题(不能直连非要加个路由器),笔记本电脑的以太网网络直接连接显示网络电缆被拔出,如下图所示:奇怪,怎么出现这种情况了呢,因为我用这台电脑调试过别的P…

基于嵌入式系统的gnash最小库依赖关系

已经对gnash的依赖库作了详细的分析,下边是必须依赖的库:GIF Required libungif-devlibxml2 Required libxml2-devPNG Requir…

git 创建webpack项目_一次create-react-app创建项目升级webpack的流水账

不再赘述为什么要升级webpack4,有兴趣的小伙伴可以看一下 知乎:如何评价webpack4下面撸起袖子开干:克隆项目,新建分支git checkout -b feature_webpack_upgrade# 相当于以下两句的简写git branch feature_webpack_upgradegit chec…

bzoj1263

贪心 n%31 分出一个4&#xff0c;其余用3&#xff0c;n%32&#xff0c;分出一个2&#xff0c;其余用3&#xff0c;然后高精度就行了 #include<bits/stdc.h> using namespace std; const int N 5005; struct BigInt {int len;int a[N];BigInt() { memset(a, 0, sizeof(a)…

c语言volatile_[技术]为什么单片机C语言编程时某一变量有时乱码

最近一个项目里面&#xff0c;在KEIL中用C语言在单片机里面定义了一个状态机全局变量&#xff0c;这个变量随时会改变&#xff0c;用于切换触摸屏的界面&#xff0c;可是程序运行中出现了一个问题&#xff0c;这个状态机号总是出现了被莫名奇妙改变的问题&#xff0c;导致触屏不…

沙箱Java代码

在上一篇文章中&#xff0c;我们研究了如何保护移动Java代码 。 这样做的一种选择是在笼子或沙箱中运行代码。 这篇文章探讨了如何为Java应用程序设置这样的沙箱。 安全经理 Java中支持沙箱的安全性设施是java.lang.SecurityManager 。 默认情况下&#xff0c;Java在没有Se…

微型计算机2017年9月上,2017年9月计算机一级考试WPS Office冲刺题

2017年9月计算机一级考试WPS Office冲刺题2017年下半年计算机一级考试将在9月份进行&#xff0c;为了方便考生备考计算机一级考试。下面是小编为大家带来的计算机一级考试WPS Office冲刺题&#xff0c;欢迎阅读。冲刺题一&#xff1a;1、PowerPoint 演示文稿和模板的扩展名是【…

七. 多线程编程5.创建多线程

到目前为止&#xff0c;我们仅用到两个线程&#xff1a;主线程和一个子线程。然而&#xff0c;你的程序可以创建所需的更多线程。例如&#xff0c;下面的程序创建了三个子线程&#xff1a;// Create multiple threads.class NewThread implements Runnable { String name; /…

11尺寸长宽 iphone_弱电工程LED显示屏尺寸规格及计算方法

前言&#xff1a;led屏幕在生活中&#xff0c;随处可见&#xff0c;显示屏、广播屏等等&#xff0c;但是led尺寸怎么计算的&#xff0c;你知道吗&#xff1f;今天我们一起了解一下led屏幕尺寸的计算方法。正文&#xff1a;一、点间距的计算1、各单元板常见型号及尺寸LED屏普遍是…

marquee标签的使用

<!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>演示marquee</title><style type"text/css">*{padding: 0px;margin: 0px;}marquee{border: 1px solid purple;}img{width: 360px;height: auto;}&…

32位数据源中没有mysql_[SpringBoot实战]快速配置多数据源(整合MyBatis)

前言由于业务需求&#xff0c;需要同时在SpringBoot中配置两套数据源&#xff08;连接两个数据库&#xff09;&#xff0c;要求能做到service层在调用各数据库表的mapper时能够自动切换数据源&#xff0c;也就是mapper自动访问正确的数据库。本文内容&#xff1a;在SpringbootM…

考研计算机冷门学校,考研5个冷门的985院校 别随大流,这些几所也是很不错的...

导语&#xff1a;想必大家考研的目的有很多&#xff0c;最主要的就是想去更好的学校提升自己&#xff0c;大部分会肯定是会更倾向于985这类的院校&#xff0c;每年其实除了那些被“挤破头”的985院校&#xff0c;其实还有不少“低调”的985院校是非常值得报考的&#xff0c;下面…