java ee的小程序

老实说,“可扩展性”是一个详尽的主题,并且通常没有被很好地理解。 通常,它被认为与高可用性相同。 我已经看到新手程序员和“经验丰富”的建筑师都建议将“ 群集 ”作为可伸缩性和HA的解决方案。 它实际上没有任何问题,但是问题在于它通常是通过谷歌搜索来完成的,而不是实际了解应用程序本身;-)

我只是写这篇文章并不声称自己是“专家” ;-)它只是(简要地)提出了一些用于扩展Java EE应用程序的总体策略。

问题…

可伸缩性不是Java EE平台规范中的标准化组件。 相关技术大多是特定于供应商(应用程序服务器)的,通常涉及使用多个产品(除了应用程序服务器本身)。 因此,将Java EE应用程序设计为可伸缩的可能会有些棘手。 没有“菜谱”可以帮您解决问题。 真正需要从内而外地了解应用程序。

缩放类型

我相信这不是您第一次阅读本文。 通常,扩展分为两大类–向上扩展,向外扩展

扩大规模的第一步自然就是扩大规模

  • 向上扩展 :这涉及向服务器中添加更多资源,例如RAM,磁盘空间,处理器等。在某些情况下这很有用,但在特定时间点之后会变得昂贵,您会发现最好采用向外扩展
  • 向外扩展 :在此过程中,将添加更多计算机或其他服务器实例/节点。 这也称为群集,因为所有服务器都应该协同工作(作为一个组或群集),并且对客户端是透明的。

高可用性!=可扩展性

是! 仅仅因为系统具有高可用性(通过使多个服务器节点进行故障转移),并不意味着它也具有可伸缩性。 HA只是意味着,如果当前的处理节点崩溃,则该请求将被传递或故障转移到集群中的另一个节点,以便它可以从开始的地方继续进行–差不多! 可伸缩性是通过增加可用资源(RAM,处理器等)来改善系统特定特性(例如,用户数量,吞吐量,性能)的能力。即使失败的请求被传递到另一个节点,您也不能保证应用程序将在那种情况下正确运行(继续阅读以了解原因)

让我们看一些选项和相关讨论

对扩展的集群进行

假设您已扩展到最大容量,现在通过让多个节点组成集群来扩展系统。 现在,您要做的就是将负载均衡器放在群集基础结构的前面,以便您可以在群集成员之间分配负载。 由于除基本知识之外我没有太多的见识,因此未详细介绍负载平衡 :-)但是知道这一点对于本文足够了

我的应用程序是

好了,现在您可以横向扩展了–够了吗? 如果您的应用程序是无状态的,则可以进行横向扩展,即您的应用程序逻辑不依赖于现有服务器状态来处理请求,例如JAX-RS上的RESTful API后端,基于消息的应用程序将远程EJB作为入口,在后面使用JMS地面等

如果您的应用程序包含HTTP会话对象,有状态EJB,会话范围的Bean(CDI,JSF)等组件,该怎么办? 它们特定于客户端(更具体地讲,是调用线程),存储特定状态,并依赖于该状态存在以便能够执行请求,例如HTTP会话对象可能存储用户的身份验证状态,购物车信息等

在横向扩展或群集应用程序中,节点中的任何群集都可以满足后续请求。 在没有第一个请求传递到的实例的JVM中创建的状态数据的情况下,另一个节点将如何处理请求?

您好粘性会议

粘性会话配置可以在负载平衡器级别上完成,以确保始终将来自特定客户端/最终用户的请求转发到同一实例/应用程序服务器节点,即保持服务器亲和力 。 因此,我们缓解了所需状态不存在的问题。 但是这里有一个陷阱– 如果该节点崩溃怎么办? 该状态将被破坏,并且用户将被转发到服务器端请求处理所不依赖的现有状态的实例。

输入

为了解决上述问题,您可以配置应用程序服务器群集机制以支持有状态组件的复制。 这样,您可以确保所有服务器实例上都存在HTTP会话数据(和其他有状态对象)。 因此,最终用户请求现在可以转发到任何服务器节点。 即使服务器实例崩溃或不可用,集群中的任何其他节点也可以处理该请求。 现在,您的群集不是普通群集,而是一个复制群集

群集复制特定于您的Java EE容器/应用服务器,最好参考其相关文档以了解具体操作。 通常,大多数应用服务器支持Java EE组件的集群,例如有状态和无状态EJB,HTTP会话,JMS队列等。

但是,这带来了另一个问题 –现在,应用程序服务器中的每个节点都处理会话数据,从而导致更多的JVM堆存储并因此产生了更多的垃圾回收。 而且,复制中也花费了很多处理能力

有状态组件的

通过将会话数据和有状态对象存储在另一层中,可以避免这种情况。 您可以使用RDBMS进行操作。 同样,大多数应用服务器都对此提供了内置支持。

如果您注意到了,我们已经将存储从内存层转移到了持久层–最终,由于数据库的原因,您可能最终会面临可扩展性问题。 我并不是说肯定会发生这种情况,但是在某些情况下(例如在发生故障转移的情况下),您的数据库可能会过载,并且延迟可能会增加,具体取决于您的应用程序,请考虑从该数据库重新创建整个用户会话状态,以供在另一个数据库中使用群集实例–这可能会花费一些时间,并在高峰负载期间影响最终用户的体验。

最后的领域:

这是最后的领域-至少在我看来,因为它使我们回到了内存中方法。 than,没有比这更好的了! 可以使用诸如Oracle Coherence,Hazelcast或任何其他分布式缓存/内存网格产品之类的产品来卸载状态存储和复制/分发的状态–这不过是缓存层而已。 好消息是,其中大多数产品都将HTTP会话存储作为默认功能支持

这种体系结构设置意味着应用程序服务器重新启动不会影响现有的用户会话-在不造成停机和最终用户中断的情况下对系统进行修补总是很不错的(虽然听起来并不那么容易,但肯定是可以选择的!)。 通常,此想法是应用程序层和Web会话缓存层可以独立工作和扩展,并且不会相互干扰。

已分发!=已复制

这些词之间存在巨大差异,因此了解缓存层的差异至关重要。 两者各有利弊

  • 分布式 :缓存成员共享数据,即数据集在缓存群集节点之间分区(使用特定于产品的算法)
  • 复制的 :所有缓存节点都具有所有数据,即每个缓存服务器都包含整个数据集的副本。

进一步阅读(主要针对Weblogic)

  • 集群配置
  • RDBMS配置用于会话持久性
  • 分布式Web会话复制– Oracle Coherence , Hazelcast
  • 高可扩展性 –巨大的资源!

在我注销之前...

  • 并非每个Java EE应用程序都要求高/极端可伸缩性。 但是,如果您打算构建Internet /面向公众的应用程序,将其纳入设计绝对是有用的
  • 对于希望利用云平台(主要是PaaS)(如自动弹性(经济可行!)和HA)的应用程序,可伸缩设计是必须的
  • 不难发现有状态应用程序在扩展方面通常更具挑战性。 完全的“无国籍”可能是不可能的,但人们应该为此努力

随意分享您用于扩展Java EE应用程序的技巧和技术。

干杯!

翻译自: https://www.javacodegeeks.com/2015/10/basics-of-scaling-java-ee-applications.html

java ee的小程序

java ee的小程序_扩展Java EE应用程序的基础相关推荐

  1. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  2. java ee的小程序_在Java EE应用程序中实现自动重试

    java ee的小程序 最初,我想将此博客称为" 具有拦截器驱动的重试策略的灵活超时 ",但后来我认为它太"繁重". 该声明以及修改后的标题应该(希望)使您了解 ...

  3. java ee 程序_第一个 JavaEE 应用程序 - JavaWeb 入门开发教程

    第一个 JavaEE 应用程序 JavaEE 是 Java Web 开发当中事实上的标准,诸多框架也都是建立在 JavaEE 的 API 基础之上的.为了从头理解 Java Web 开发,我们将从一个 ...

  4. java 提醒小工具_【JAVA】一个简单的定时提醒小程序

    [Java] 纯文本查看 复制代码import javax.swing.JOptionPane; public class Test { public static void main(String[ ...

  5. java如何编写屏幕保护程序_将Java App转换为Windows屏幕保护程序

    小编典典 Windows屏幕保护程序只是接受某些命令行参数的程序.因此,为了使您的程序可以作为屏幕保护程序运行,您必须对其进行编码以接受这些参数. 接下来,您可能希望屏幕保护程序以全屏模式运行.这在J ...

  6. java教务系统类设计_基于Java EE体系的高校教务管理系统的设计开发

    <基于Java EE体系的高校教务管理系统的设计开发>由会员分享,可在线阅读,更多相关<基于Java EE体系的高校教务管理系统的设计开发(3页珍藏版)>请在人人文库网上搜索. ...

  7. 黑马ee在职进阶视频_进阶– Java EE 7前端5强

    黑马ee在职进阶视频 系列继续. 在初步概述和Arjan关于最重要的后端功能的文章之后 ,我现在非常高兴让Ed Burns( @edburns )使用他最喜欢的Java EE 7前端功能完成本系列. ...

  8. java ee 的使用方法_改善Java EE生产支持技能的8种方法

    java ee 的使用方法 参与Java EE生产支持的每个人都知道这项工作可能很困难. 7/24寻呼机支持,多个事件和错误修复(要定期处理),来自客户和管理团队的压力,要求它们尽快解决生产问题并防止 ...

  9. java质数和合数的程序_《java项目实训》课程设计计算器.doc

    <java项目实训>课程设计计算器.doc 课程设计报告课程名称JAVA项目实训课程设计设计名称基于JAVA计算器的设计与实现学生学号学生姓名学生学号学生姓名学生学号学生姓名学生学号学生姓 ...

最新文章

  1. 松本行弘:我的编程人生
  2. HDU - 5306 Gorgeous Sequence(吉司机线段树)
  3. Ruby中的%表示法
  4. 弹出框设置在页面居中
  5. Matplotlib 中文用户指南 4.1 文本介绍
  6. 获取linux命令硬盘信息,Linux下如何获取磁盘信息
  7. python语言的多行注释以什么开头和结尾_Python单行注释与多行注释
  8. Android开发笔记(一百六十七)Android8.0的画中画模式
  9. Asp.Net Core 入门(八)—— Taghelper
  10. 思科模拟器简单校园网设计,期末作业难度
  11. MySQL卸载不干净或Mysql安装失败的解决办法
  12. 最新GEM技术导航系统开心版源码+免授权
  13. 计算机科学技术专业发展分析,计算机科学与技术发展现况分析
  14. 【前端作业系列】HTML基础点 , 训练<有序列表><无序列表>(2022年6月15日作业)
  15. windows内网的情况下如何访问外网
  16. .doc文档无法设置默认打开方式
  17. H5页面免费制作工具大集合
  18. Python-pptx Table
  19. 20170627总结
  20. 编译链接实战(12)crt1.o, crti.o, crtbegin.o, crtend.o, crtn.o是什么东西

热门文章

  1. P3507-[POI2010]GRA-The Minima Game【dp,博弈论】
  2. P4074-[WC2013]糖果公园【树上带修莫队】
  3. jzoj3059-雕塑【容斥,数论】
  4. 【矩阵乘法】Quad Tiling(poj 3420)
  5. 初一模拟赛总结(2019.4.13)
  6. 【Floyed】【最短路】商店选址问题(ssl 1760)
  7. jstack命令:教你如何排查多线程问题
  8. 相比学习好的学生,老师最喜欢努力认真学习的学生
  9. com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。
  10. javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext-dao.xml