java ee的小程序_扩展Java EE应用程序的基础

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

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

干杯!

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

java ee的小程序

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

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

相关文章

28 张图,一次性说清楚 TCP,速度

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删做IT相关的工作,肯定都离不开网络,网络中最重要的协议是TCP。无论是实际工作还是笔试面试,你看哪里能少得了T…

晨风机器人怎么买奴隶_潮牌复刻和正品该怎么抉择???带你了解了解

今天带你们聊一聊潮牌复刻和正品,简单介绍一下我自己,在复刻圈子五年,我的原则从始至终就是质量放在第一位,之所以能走这么久也是这个原因。回归正题,接着往下看。无论是正品还是复刻,其实还要根据自己的能…

php cdi_本机CDI限定词:@Any和@Default

php cdi让我们看一下CDI中的开箱即用的限定词 CDI规范声明了三个限定符– Any, Default, New Any :将其视为无所不在的限定词。 它在那里,即使不是;-) Default :顾名思义,当没有其他限定符时&#xff0…

C语言字符串函数strcat | strcpy | strlen | strcmp的用法及原型

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删strcat(str1,str2) 意为将字符串str2连接到字符串str1之后strcat用法如下#include <stdio.h> #include <string.h>int main () {cha…

crntos7启动php命令_CentOS7设置php-fpm开机自启动

php-fpm安装成功后并不会开机启动&#xff0c;如果是运行正常的程序在系统重启后出现502报错(502 Bad Gateway)&#xff0c;通常就是php-fpm没启动起来。0 先确定几个文件的位置&#xff0c;记录下来备用a php-fpmwhich php-fpm/usr/sbin/php-fpmb conf#几个可能的位置#/etc/ph…

java jpa 异步编程_异步处理时的JPA

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

C语言字符数组与字符串的使用详解

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删正文1、字符数组的定义与初始化字符数组的初始化&#xff0c;最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]{ I, ,a,m, ,‘h,a,p…

SRC挖洞网集合

阿里SRC https://security.alibaba.com/ 蚂蚁集团SRC https://security.alipay.com/ 阿里本地生活SRC https://asrc.alibaba.com/#/ 京东安全应急响应中心 https://security.jd.com/#/ 腾讯SRC https://security.tencent.com/ 美团安全应急响应中心 https://security.meit…

不能将紧实的字段 绑定到_代码整洁之道【笔记】

一、整洁代码A.混乱的代价1.有些团队在项目初期进展迅速&#xff0c;但有那么一两年的时间却慢去蜗行。对代码的每次修改都影响到其他两三处代码2.花时间保持代码整洁不但有关效率&#xff0c;还有关生存3.程序员遵从不了解混乱风险经理的意愿&#xff0c;也是不专业的做法4.Bj…

存根类 测试代码 java_测试双打:模拟,假人和存根

存根类 测试代码 java大多数班级都有合作者。 在进行单元测试时&#xff0c;您通常希望避免使用那些协作者的实际实现方式来避免测试的脆弱性和绑定/耦合&#xff0c;而应使用测试双打&#xff1a;模拟&#xff0c;存根和双打。 本文引用了有关该主题的两篇现有文章&#xff1…

5 个牛逼的算法设计,你知道几个?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、分治法概念&#xff1a;将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问题&#xff0c;以便各个击破&#xff0c;分而治之…

python2.7.10安装教程_Linux系统(CentOS)下python2.7.10安装

本文记录了Linux系统(CentOS)安装Python&#xff0c;供大家参考&#xff0c;具体内容如下Python(Linux) 下载地址操作系统&#xff1a;Centos6.41、下载下载的版本&#xff1a;Python-2.7.10.tgz2、安装一般情况下&#xff0c;Linux都会预装 Python了&#xff0c;但版本较低。(…

javafx窗体程序_JavaFX实际应用程序:AISO HRC-Matic

javafx窗体程序“ Real-World JavaFX Apps”系列中的第三个应用程序是一种重型数据输入应用程序&#xff0c;由称为HRC-Matic的关系数据库支持。 它由AISO在日内瓦开发。 AISO是一家专门开发基于JavaFX的业务应用程序的公司。 他们还在研究我在本系列的第一个博客&#xff08; …

x201换风扇_笔记本怎么换风扇 ThinkPad X201i换风扇图文教程

ThinkPad X201i换电扇图文教程&#xff1a;拆机之前&#xff0c;我们需求先对X201i的散热电扇在停止了开端的理解&#xff0c;得知价钱从10元左右的单电扇&#xff0c;到上百的散热全体都有&#xff0c;而且还分东芝产和松下产等不同产地的&#xff0c;小编选择了松下产的整套散…

几十个Shell分析日志文件脚本!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删收集&#xff0c;整理一些服务器日志分析命令&#xff0c;可以用来分析自己网站服务器日志&#xff0c; 看看网站的访问量。看看有没有黑阔搞破坏…

flex布局水平垂直 垂直_垂直和水平装饰

flex布局水平垂直 垂直装饰器模式是在不更改其接口的情况下向对象添加功能的最佳方法之一。 我经常使用可组合装饰器&#xff0c;并且总是会问自己在功能列表必须可配置时如何正确设计它们。 我不确定我的答案是否正确&#xff0c;但是这里有一些值得深思的地方。 The Apartme…

一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删栈是什么&#xff1f;栈有什么作用&#xff1f;首先&#xff0c;栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是后入先出 (LIFO, L…

thinkphp6企业项目实战_[MarsZ]ThinkPHP项目实战总结

本文原word格式百度云盘下载地址&#xff1a;综述 2需求 2作者 2系统一览 2Unity3d客户端 2PHP后台 4准备 6XAMPP 6官网 6下载地址 6教程 6ThinkPHP 6官网 7项目所用版本 7下载地址 7快速入门 7完全手册 7步骤 7准备ThinkPHP 7修改MySQL设置信息 8检测是否成功 9扩展&#xff1…

java包装模式_在Java8中包装设计模式

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

c得到当前时分秒 linux_Linuxc - Linux系统下的时间知识点

Unix/Linux系统下的时间知识点一、Unix/Linux系统的几种时间结构&#xff1a;1、time_t 类型&#xff1a;长整型&#xff0c;一般用来表示从1970-01-01 00:00:00时以来的秒数&#xff0c;精确度&#xff1a;秒&#xff1b;由函数time()获取&#xff1b;该类型定义在头文件 /usr…