我扮演的关键角色之一是在本地社区中传播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

将涡轮增压器添加到JEE Apps相关推荐

  1. jee过滤器应用场景_将涡轮增压器添加到JEE Apps

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

  2. 全球上线!ABB中国涡轮增压器分拆 – 数据清理阶段完成

    ABB是数字行业的技术前沿者,拥有四项主营业务:电气化,工业自动化,运动控制以及机器人和离散自动化.ABB总部位于瑞士苏黎世,业务遍及100多个国家,拥有约105,000名员工.2021年,该公司的收 ...

  3. 电池寿命增压器为android,一个涡轮增压器的寿命只有10年?

    随着技术的不断的进步,欧洲严格的排放限制,涡轮增压车型逐渐成为市场上的主流.但问题是,很多人都有疑问,涡轮增压发动机,真的寿命短吗?维护费用真的很高的吗?今天就来说说. 涡轮增压器如何工作的? 涡轮增 ...

  4. 挖机的涡轮增压器为什么会窜(漏)机油呢?有什么后果?

    烧机油,几乎是大多数司机的痛点,但凡是辆车都脱离不了机油消耗的命运,而"过量"的机油消耗却会带来发动机的严重性损伤.而涡轮增压器窜机油就是导致"过量"消耗机油的 ...

  5. 沃尔沃T5发动机涡轮增压器

    电控废气涡轮增压系统的结构与工作原理_马明芳 https://wenku.baidu.com/view/a9700e5cda38376baf1faea4.html 废气涡轮增压控制系统的工作原理 ht ...

  6. 在stm32f103上运行nuttx,添加app和driver的流程

    以stm32f103的led(PC13)为例子 heyi@ubuntu:~/nuttx/heyi_1_nuttx/nuttx/tools$ ./configure.sh stm32f103-minim ...

  7. 微软 appcenter_使用Visual Studio AppCenter使用Xcode和IPA托管构建自动化

    微软 appcenter Using Xcode CLI to create build automation and upload scripts for your CI/CD or local m ...

  8. 尾气冒黑烟是什么问题_对机动车环保检测尾气排放的了解!

    "史上最严排放标准"-- 国六已经实施. 这意味着: 国五车保值率将受到严重打击 国四车年审.上牌.限行等受限制 国三车更惨,难逃报废的命运··· 总结起来,一个字: 对于很多老车 ...

  9. 柴油发电机组常见故障及处理方法

    A.机组无法启动 1.机组启动电瓶容量不足,应对电瓶进行维护(充电.补液)必要时更换此电瓶. 2.控制屏没有上电,应检查控制屏上熔断器是否熔断. 3.启动继电器故障,应更换此继电器 4.启动马达故障, ...

最新文章

  1. java 下一代,什么是"下一代插件"对Java
  2. ios键盘横屏_cocos2d 3.2版本IOS因键盘引起横竖屏问题
  3. Python如何读取文件
  4. PCGen的垃圾收集分析
  5. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(2月6日-2月12日)
  6. pandas 画折线图_如何从Pandas数据帧绘制多个折线图
  7. opc client for php,使用vb/vba作为OPC client
  8. java环境变量配置失败_java环境变量配置失败是怎么回事?出错解决办法分享
  9. Citrix XenApp工作原理
  10. sparc架构代码分析-setup_arch函数分析
  11. window7磁盘分区
  12. java幸运抽奖项目
  13. noob学python #1
  14. python unpack_python struct中pack和unpack
  15. IDA及插件MIPSROP安装——《揭秘家用路由器0day漏洞挖掘技术》学习笔记
  16. windows系统背景淡绿护眼色设置
  17. Datawhale零基础入门数据挖掘-Task5模型融合
  18. Web全栈~04.css入门
  19. ADSL后台初始密码大全
  20. 费马小定理看了等于没看证明

热门文章

  1. kafka再均衡监听器测试
  2. Flex布局 让你的布局更完美
  3. 动态资源Servlet接口
  4. orm提取指定列_使用ORM提取数据很容易! 是吗?
  5. aws jenkins_Jenkins在AWS上(第1部分)
  6. 堆栈溢出 java_堆栈溢出回答了我们所不知道的Java首要问题
  7. aws fargate_借助Fargate和EKS,AWS甚至可以实现Cloud-ier和Kuberneties-ier
  8. 使用Spring Cloud Gateway保护反应式微服务
  9. 混合多云每个人都应避免的3个陷阱(第2部分)
  10. JPA persistence.xml SQL脚本定义