扩展Java EE应用程序的基础

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

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

问题…

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

缩放类型

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

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

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

高可用性!=可扩展性

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

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

对扩展的集群进行

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

带有lb-pptx的简单集群

我的应用程序是

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

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

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

有状态或无状态1

有状态或无状态21

您好粘性会话

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

粘性1

黏性21

输入

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

复制集群1

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

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

有状态组件的

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

rdms-as-cluster-store2

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

最后的领域:

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

分布式缓存群集存储1

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

已分发!=已复制

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

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

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

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

在我退出之前...

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

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

干杯!

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

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

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

相关文章

Mac MySQLdb模块安装,可算解决了

转载:http://blog.csdn.net/janronehoo/article/details/25207825 叨叨 短评:这篇文章感觉是比较全面解决Mac MySQLdb模块安装问题的文章了,特别转载一下 安装过程主要是mysql_config not found错误,这个错误通常卡住很多初学者&a…

史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读

目录 第 1 章 介绍... 1 1.1. 什么是Wireshark. 1 1.1.1. 主要应用... 1

小白自学前端,轻松月入过万哦!

第一、 前端的入门操作 首先是要熟悉前端的基础操作。 前端的基础:JavaScript,HTML,CSS,然后可以深入学习jQuery。 如果你是想 1.专攻网页,那你就学习HTML。 2.专攻层叠样式表,就学习CSS,它可以…

解决hibernate中的懒加载(延迟加载)问题

解决hibernate中的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载问题&#xff0c;在实体映射时&#xff0c;多对一和多对多中&#xff0c;多的一样的属性默认是lazy"true"(即&#xff0c;默认是延迟加载)&#xff0c; 如&#xff1a;<many-to-one nam…

netbeans代码提示_Java代码现代化的七个NetBeans提示

netbeans代码提示在“ 七个不可或缺的NetBeans Java提示”一文中 &#xff0c;我谈到了一般使用NetBeans提示的问题&#xff0c;然后重点介绍了七个提示。 接下来列出了该帖子中强调的七个提示&#xff1a; 可疑方法调用 使用或&#xff01; AND字符串构造函数比较字符串 构造…

史上最全SVN使用总结,建议先收藏后观看

最近在公司又开始玩SVN啦&#xff0c;这里给大家总结一下&#xff0c;基本上在公司不是用git就是用SVN进行代码管理&#xff0c;作为程序员&#xff0c;这些工具的使用还是需要熟悉了解一下的&#xff0c;本期孙叫兽给大家分享一下SVN相关的知识点&#xff0c;做到会用即可。不…

JS常用正则表达式

感谢水之原的整理&#xff0c;比较全得正则表达式 整数或者小数&#xff1a;^[0-9]\.{0,1}[0-9]{0,2}$只能输入数字&#xff1a;"^[0-9]*$"。只能输入n位的数字&#xff1a;"^\d{n}$"。只能输入至少n位的数字&#xff1a;"^\d{n,}$"。只能输入m~…

14万字面试题汇总整理,祝你顺利斩获大厂前端offer

导读&#xff1a;最近很多小伙伴私信我说&#xff0c;一般大厂的前端面试题都有哪些&#xff0c;应该如何准备&#xff0c;要不要刷题等等&#xff0c;这里孙叫兽简单给大家总结一下前端的高频面试题&#xff0c;如果对你有帮助&#xff0c;记得点赞评论收藏。现在很多大厂都比…

异步处理时的JPA

几年前&#xff0c;在Java世界中&#xff0c;几乎所有的“企业”类项目都需要JPA与数据库进行通信&#xff0c;这几乎是显而易见的。 JPA是Joel Spolsky描述的“ 泄漏抽象 ”的完美示例。 刚开始时很棒而又容易&#xff0c;但最后很难调整和限制。 对于许多参与数据访问层的后端…

又见链表 --- 另一种Creat方式与反转

链表 作为一种数据结构&#xff0c;链表以其方便的增删查改功能&#xff0c;实现了无数经典有用的程序。 在之前的帖子里&#xff0c;我构建链表的方式是建立一个不储存数据的head节点&#xff0c;然后通过一边输入数据一边建立结点的方式构建整个链表。 与之前不同的是&#x…

Hystrix简介–总结

这是其他两篇文章的后续文章– 动机 &#xff0c;说明为什么在分布式系统中需要类似Hystrix的内容&#xff0c;以及Hystrix的基本介绍 。 这将是我的Hystrix旅程的总结&#xff0c;其中包含各种属性的详细信息&#xff0c;可以对这些属性进行调整以更改Hystrix的行为&#xff…

git常用命令有用

http://www.cnblogs.com/cspku/articles/Git_cmds.html转载于:https://www.cnblogs.com/yanjunhelloworld/p/5507706.html

现在抖音这么火,那么你知道如何用CSS实现抖音字体?

比如这种抖音字体是不是感觉很酷,它是如何实现的呢,下面孙叫兽就简单分享一下CSS的实现方法,记得点赞收藏。 老司机给大家的一些小建议,一定要敲代码敲代码敲代码(重要的事情说三遍),程序员是实战家,不是思想家和理论家,程序员都是工兵,这个排雷的经验很重要。 实现这…

史上最全关于苹果开发者账号及上架APPStore总结

很多人如果开发这种移动应用APP,上架到到APPStore难免会遇到一系列的问题,这里孙叫兽进行总结一下,如果本文对你有帮助,记得转发点赞收藏。 一: 开发者账号的介绍 1 个人开发者账号 申请费用: 99美元/年 介绍:一般由iOS开发者个人申请,上架开发者自己的APP作品到苹果商…

EK算法应用,构图(POJ1149)

题目链接&#xff1a;http://poj.org/problem?id1149 题意中有一点要注意&#xff0c;否则构图就会有问题&#xff0c;每个顾客走后&#xff0c;被打开过的那些猪圈中的猪都可以被任意的调换到其他开着的猪圈中。 这里的构图不是单一的相邻&#xff0c;以及容量了&#xff0c;…

平台代码检查工具:sonarLint+sonarqube安装教程

加强对代码质量的管控要求&#xff0c;不允许新增代码部分出现严重、重要、主要等sonar扫描问题。 大家按以下文档安装开发工具对应的代码检测插件&#xff0c;请大家务必重视、执行.这里只介绍前端开发VSCode,后端开发Eclipse,两种代表性的编译器安装sonarLintsonarqube方法,其…

jboss as安装配置_书评:JBoss AS 7:配置,部署和管理

jboss as安装配置我热切地接受Packt Publishing邀请复审JBoss AS 7&#xff1a;配置&#xff0c;部署和管理&#xff0c;因为自从我上次使用JBoss已有数年了&#xff0c;我很想了解有关JBoss AS 7的更多信息。 我已经写过关于《 JBoss AS 7配置&#xff0c;部署和管理》一书的第…

程序员通过CSDN如何获取收益

大家好,我是孙叫兽 ,本期内容给大家分享如何使用CSDN一边学习,一遍赚取收益,这样学习的时候也会产生动力. 废话不多说,直接看近7天收益. 博主如何赚取收益 对于博主这些创作者来说,收益主要有付费专栏,VIP文章收益,活动收益,红包收益,问答收益,打赏收益,付费资源收益,下载VIP分…

在Java8中包装设计模式

环绕模式未在GOF书中列出&#xff0c;但对于以下问题非常有用&#xff1a; 循环构造&#xff0c;例如执行while / while / for循环 秒表周围的一些代码。 用运行时异常包装检查的异常 初始化和清理&#xff0c;例如创建/销毁线程池或打开/关闭文件等 将上下文信息添加到线…

《Windows驱动开发技术详解》之编程加载NT式驱动

之前我们加载驱动都是利用INSTDRV这个应用&#xff0c;其原理是在注册表中写入相应的字段&#xff0c;这一节我们手动编写代码去加载驱动&#xff0c;其原理类似&#xff1a; 设备驱动程序的动态加载主要由服务控制管理程序&#xff08;Service Control Manager,SCM&#xff09…