Java高并发解决方案

高并发是互联网应用的一大特点,也是互联网应用不可避免的一个问题;比如淘宝双11购物狂欢节,京东618购物促销节,12306春节火车票,促销,秒杀等。

解决高并发问题是一个系统工程,需要站在全局高度统筹谋划,从多个角度进行架构设计;

解决高并发问题,不是一个或两个方案就能解决的,需要从各个维度综合施策才能完成;

在实践中,我们总结和提炼出来了很多应对高并发的方案或者说手段,分别如下:

系统访问用户增多,流量增大,导致服务器压力增大,出现性能瓶颈,我们可以采用一个简单粗暴的策略:提升服务器硬件配置,提升服务器硬件配置的策略,也称为:单体应用垂直扩容。

比如:产品或者网站初期,通常功能较少,用户量也不多,一般就采用一个项目工程来完成,这就是单体应用,也叫集中式应用。

按照经典的MVC三层架构设计,部署单台服务器,使用单台数据库,应用系统和数据库部署在同一台服务器上,随着应用系统功能的增加,访问用户的增多,单台服务器已无法承受那么多的访问流量。

此时,我们可以直接采用简单粗暴的办法:提升硬件配置来解决。

?CPU从32位提升为64位

?内存从64GB提升为256GB(比如缓存服务器);

?磁盘从HDD(HardDiskDrive)提升为SSD(固态硬盘(SolidStateDrives)),有大量读写的应用

?磁盘扩容,1TB扩展到2TB,比如文件系统

?千兆网卡提升为万兆网卡

但是不管怎么提升硬件性能,硬件性能的提升不可能永无止尽,所以最终还是要靠分布式解决。

缓存可以说是解决大流量高并发,优化系统性能非常重要的一个策略;

它是解决性能问题的利器,就像一把瑞士军刀,锋利强大;

缓存在高并发系统中无处不在(到处都是)。

①浏览器缓存

浏览器缓存是指当我们使用浏览器访问一些网站页面或者HTTP服务时,根据服务器端返回的缓存设置响应头将响应内容缓存到浏览器,下次可以直接使用缓存内容或者仅需要去服务器端验证内容是否过期即可,这样可以减少浏览器和服务器之间来回传输的数据量,节省带宽,提升性能;

第一次访问返回200,第二次刷新访问,返回响应码为304,表示页面内容没有修改过,浏览器缓存的内容还是最新的,不需要从服务器获取,直接读取浏览器缓存即可

我们也可以在Java代码中通过设置响应头,告诉前端浏览器进行缓存:

Nginx提供了expires指令来实现缓存控制,比如:

location/static{ root/opt/static/; expires1d;//全天}当用户访问时,Nginx拦截到请求后先从Nginx本地缓存查询数据,如果有并且没有过期,则直接返回缓存内容。

③CDN缓存

CDN的全称是ContentDeliveryNetwork,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

CDN它本身也是一个缓存,它把后端应用的数据缓存起来,用户要访问的时候,直接从CDN上获取,不需要走后端的Nginx,以及具体应用服务器Tomcat,它的作用主要是加速数据的传输,也提高稳定性,如果从CDN上没有获取到数据,再走后端的Nginx缓存,Nginx上也没有,则走后端的应用服务器,CDN主要缓存静态资源。

①内存缓存

在内存中缓存数据,效率高,速度快,应用重启缓存丢失。

②磁盘缓存

在磁盘缓存数据,读取效率较之内存缓存稍低,应用重启缓存不会丢失。

代码组件:Guava、Ehcache

服务器:Redis、MemCache

在整个应用系统的不同层级进行数据的缓存,多层次缓存,来提升访问效率;

比如:浏览器->CDN->Nginx->Redis->DB(磁盘、文件系统)

?经常需要读取的数据

?频繁访问的数据

?热点数据缓存

?IO瓶颈数据

?计算昂贵的数据

?无需实时更新的数据

?缓存的目的是减少对后端服务的访问,降低后端服务的压力

有一个单体应用,当访问流量很大无法支撑,那么可以集群部署,也叫单体应用水平扩容,原来通过部署一台服务器提供服务,现在就多部署几台,那么服务的能力就会提升。

部署了多台服务器,但是用户访问入口只能是一个,比如www.web.com,所以就需要负载均衡,负载均衡是应用集群扩容后的必须步骤,集群部署后,用户的会话session状态要保持的话,就需要实现session共享。

应用的拆分:分布式(微服务)

单体应用,随着业务的发展,应用功能的增加,单体应用就逐步变得非常庞大,很多人维护这么一个系统,开发、测试、上线都会造成很大问题,比如代码冲突,代码重复,逻辑错综混乱,代码逻辑复杂度增加,响应新需求的速度降低,隐藏的风险增大,所以需要按照业务维度进行应用拆分,采用分布式开发;

随着业务复杂度增加,我们需要采用一些开源方案进行开发,提升开发和维护效率,比如Dubbo、SpringCloud;

通过应用拆分之后,扩容就变得容易,如果此时系统处理能力跟不上,只需要增加服务器即可(把拆分后的每一个服务再多做几个集群)。

数据库拆分分为:垂直拆分和水平拆分(分库分表);

按照业务维度把相同类型的表放在一个数据库,另一些表放在另一个数据库,这种方式的拆分叫垂直拆分,也就是在不同库建不同表,把表分散到各个数据库;

比如产品、订单、用户三类数据以前在一个数据库中,现在可以用三个数据库,分别为产品数据库、订单数据库、用户数据库;

这样可以将不同的数据库部署在不同的服务器上,提升单机容量和性能问题,也解决多个表之间的IO竞争问题;

根据数据行的特点和规则,将表中的某些行切分到一个数据库,而另外的某些行又切分到另一个数据库,这种方式的拆分叫水平拆分;

单库单表在数据量和流量增大的过程中,大表往往会成为性能瓶颈,所以数据库要进行水平拆分;

数据库拆分,采用一些开源方案,降低开发难度,比如:MyCat、Sharding-Sphere。

对于一些访问量大,更新频率较低的数据,可直接定时生成静态html页面,供前端访问,而不是访问jsp;

常用静态化的技术:freemaker、velocity;

定时任务,每隔2分钟生成一次首页的静态化页面;

页面静态化首先可以大大提升访问速度,不需要去访问数据库或者缓存来获取数据,浏览器直接加载html页即可;

页面静态化可以提升网站稳定性,如果程序或数据库出了问题,静态页面依然可以正常访问。

采用比如Nginx实现动静分离,Nginx负责代理静态资源,Tomcat负责处理动态资源;

Nginx的效率极高,利用它处理静态资源,可以为后端服务器分担压力;

动静分离架构示意图

redis和nginx并发量5w左右,tomcat和mysql700左右,当然可以通过一些方式调整。

?采用队列是解决高并发大流量的利器

?队列的作用就是:异步处理/流量削峰/系统解耦

?异步处理是使用队列的一个主要原因,比如注册成功了,发优惠券/送积分/送红包/发短信/发邮件等操作都可以异步处理

?使用队列流量削峰,比如并发下单、秒杀等,可以考虑使用队列将请求暂时入队,通过队列的方式将流量削平,变成平缓请求进行处理,避免应用系统因瞬间的巨大压力而压垮

?使用队列实现系统解耦,比如支付成功了,发消息通知物流系统,发票系统,库存系统等,而无需直接调用这些系统;

?队列应用场景

不是所有的处理都必须要实时处理;

不是所有的请求都必须要实时告诉用户结果;

不是所有的请求都必须100%一次性处理成功;

不知道哪个系统需要我的协助来实现它的业务处理,保证最终一致性,不需要强一致性。

常见的消息队列产品:ActiveMQ/RabbitMQ/RocketMQ/kafka

?ActiveMQ是jms规范下的一个老牌的成熟的消息中间件/消息服务器

?RabbitMQ/RocketMQ数据可靠性极好,性能也非常优秀,在一些金融领域、电商领域使用很广泛;RocketMQ是阿里巴巴的;

?kafka主要运用在大数据领域,用于对数据的分析,日志的分析等处理,它有可能产生消息的丢失问题,它追求性能,性能极好,不追求数据的可靠性

在实际开发中,我们经常会采用一些池化技术,减少资源消耗,提升系统性能。

通过复用对象,减少对象创建和垃圾收集器回收对象的资源开销;

可以采用commons-pool2实现;

实际项目采用对象池并不常见,主要在开发框架或组件的时候会采用。

Druid/DBCP/C3P0/BoneCP

JedisPool(内部基于commons-pool2实现)

核心实现类:PoolingClientConnectionManager

Java提供java.util.concurrent包可以实现线程池

Executors.newFixedThreadPool(8);线程数量固定

Executors.newSingleThreadExecutor();只有一个线程,避免关闭情况

Executors.newCachedThreadPool();可以自动扩容

Executors.newScheduledThreadPool(10);每隔多久执行

设置JVM参数

-server-Xmx4g-Xms4g-Xmn256m

-XX:PermSize=128m

-Xss256k

-XX:+DisableExplicitGC

-XX:+UseConcMarkSweepGC

-XX:+CMSParallelRemarkEnabled

-XX:+UseCMSCompactAtFullCollection

-XX:LargePageSizeInBytes=128m

?设置JVM参数,可以参考JVM优化参数

在tomcat的bin目录下的catalina.sh中设置jvm参数:

JAVA_OPTS="-server-XX:+PrintGCDetails-Xmx4g-Xms4g-Xmn256m

-XX:+UseFastAccessorMethods

-XX:+UseCMSInitiatingOccupancyOnly

-XX:CMSInitiatingOccupancyFraction=70"

?设置tomcat的线程池大小

?设置IO模式

?配置APR

?养成良好的编程习惯

?不要重复创建太多对象

?流/文件/连接一定要记得在finally块中关闭

?少用重量级同步锁synchronized,采用Lock

?不要在循环体中使用try/catch

?多定义局部变量,少定义成员变量

修改数据库服务器的配置文件的参数,偏DBA(数据库管理员)

?将数据库服务器和应用服务器分离

?读写分离:通过数据库主从架构解决,写数据时操作主库,读数据时操作从库,分摊读写压力

?分库分表:扩容数据库,解决数据量容量问题

?建立合适的索引

?建立索引的字段尽量的小,最好是数值

?尽量在唯一性高的字段上创建索引,主键、序号等

?不要在性别这种唯一性很低的字段上创建索引

SQL优化很多,可以总结出很多经验;

solr/elasticsearch

调整配置文件参数

worker_processes16;gzipon;#开启gzip压缩输出events{worker_connections65535;#极限值65535 multi_accepton;#开启多路连接 useepoll;#使用epoll模型}13.Linux优化

优化Linux内核参数

修改/etc/sysctl.conf

机房、带宽、路由器等方面优化

网络架构更合理

运维的职责

?压缩变小

?压缩工具

?多个js合并成一个js文件,直接手动拷贝到一个文件中去,页面只加载这一个文件或者利用程序,比如controller,/aa/jspath=xxx.js,xxx.js

?多个css文件合并成一个css文件

?不要加载太多js和css

?js和css加载放在页面的尾部,从用户体验角度考虑的

?页面上减少到服务的请求数

?压测就是压力测试

?在系统上线前,需要对系统各个环节进行压力测试,发现系统的瓶颈点,然后对系统的瓶颈点,进行调优。调优完成后,还需要考虑另外一些风险因素,比如网络不稳定,机房故障等。所以我们需要提前有故障预备方案,比如多机房部署容灾、路由切换等。故障预备方案做好后,还需要提前进行演练,以确保预案的有效性

?压力测试工具:ApacheJMeter/LoadRunner等,偏测试的工作

?CTO、架构师,技术团队、测试团队、运维团队、DBA等共同完成

总结

完成以上的工作,我们才能实现一个高并发、高性能、高可用的“三高”分布式系统。

THE END
1.快速了解:短信测试压力平台短信测压在线平台在当今数字化时代,短信作为一种重要的通信方式,广泛应用于各个领域,包括金融交易验证码发送、企业营销推广、个人信息通知等。为了确保短信能够准确、快速且稳定地送达目标用户,短信测试平台应运而生。它在短信服务的全生命周期中扮演着不可或缺的角色,为企业和开发者提供了全面、高效的测试解决方案。 https://www.jianshu.com/p/39649cc3e209
2.手机短信软件app有哪些免费手机短信软件app下载安装在微信、QQ这些软件出现前,大家最常用的联系方式除了电话就是发短信,很多的小伙伴都有开过短信包月,今天小编给大家推荐几款好用的手机短信软件,这类app是非常强大的短信管理软件,能够完全的替代大家手机上的短信功能,支持用户发送短信、批量处理短信等,还有各种炫酷的界面特效,支持气泡对话框等各种装饰,感兴趣的用户http://www.downcc.com/k/sjdx/
3.每个程序员都在推荐的好用api短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可达,99.99%到达率,支持大容量高并发。 通知短信:短信通知支持三大运营商以及虚拟运营商,我们提供电信级运维保障、独享专用通道。 全国快递物流查询:目前已支持600+快递公司的快递信息查询。自动识别快递公司及单号,服务器毫秒响应,数据https://blog.csdn.net/m0_58974397/article/details/144420118
4.短信推送springbootmob64ca13fd163c的技术博客短信服务以及邮件推送服务使用的都是阿里云的产品,短信服务是收费的,所以需要选择短信服务的套餐并预充值才能使用。邮件推送服务是有200条的免费额度。 一:短信服务 1、申请短信签名、短信模板 到阿里云的短信服务 控制台,国内消息:签名管理中申请短信签名,模板管理中申请短信模板。 https://blog.51cto.com/u_16213603/12848024
5.测试并发量在施压过程中,根据被压测接口的RT表现不同,施压引擎为了达到您指定的吞吐量,会自适应调整虚拟用户数(即并发量)。 问答 2023-09-05 来自:开发者社区 麻烦问一下PTS,阿里云性能测试使用jmeter压测的话对接口想压不同的并发量这个要怎么控制呀? 问题1:麻烦问一下PTS,阿里云性能测试使用jmeter压测的话对接口想压https://www.aliyun.com/sswb/1759006.html
6.来了短信码农集市专业分享IT编程学习资源在现代通信技术中,短信服务已成为企业与客户沟通的重要桥梁。为了确保信息的准确传递和及时反馈,后台管理系统成为了不可或缺的工具。它不仅能够实时监控短信的发送状态,还能详细展示发送余额和记录发送详情。通过后台管理系统,企业可以清晰地了解每条短信的具体信息,包https://www.coder100.com/index/index/content/id/4315714
7.免费有意思的好用API推荐短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可达,99.99%到达率,支持大容量高并发。 通知短信:当您需要快速通知用户时,通知短信是最快捷有效的方式。短信通知支持三大运营商以及虚拟运营商,我们提供电信级运维保障、独享专用通道。 https://blog.itpub.net/70032578/viewspace-3057072/
8.在线短信压测,惩戒骗子必备在线短信压测,惩戒骗子必备 在线地址:https://www.ceya001.cn/https://www.xc6b.com/qqjs/11440.html
9.在线短信测压平台腾讯云开发者社区是一种基于云计算技术的服务平台,用于测试短信发送的性能和稳定性。它可以模拟大规模的短信发送场景,通过向目标系统发送大量短信并监测响应时间、成功率等指标,评估目标系统在高负载情况下的性能表现。 在线短https://cloud.tencent.cn/developer/information/%E5%9C%A8%E7%BA%BF%E7%9F%AD%E4%BF%A1%E6%B5%8B%E5%8E%8B%E5%B9%B3%E5%8F%B0
10.手机版下载短信压力测试v3.0app直装至尊免费版下载2.在短信接收的过程中也许会出现卡顿现象,会为用户提供一些有用的建议。 3.一键点击可以快速的对手机进行加速,这样就能够优化自己的手机性能。 《短信压力测试v3.0》软件测评: 为用户提供了多种短信模板,用户可以选择相应的短信内容进行发送操作。 在进行短信压测时,需要注意以下几点: 1. 确保测试环境的安全性和稳定https://www.juxia.com/sjwy/ruanjian-574948.html
11.短信在线压测平台关于短信在线压测平台 使用F5和Cisco等厂商推出的DDoS解决方案。, DDoS攻击(Distributed Denial of Service)是一种通过同时从多个位置对目标服务器发送高数量的数据包,导致服务器负载过重而无法处理合法用户请求的方式。攻击者使用一个或多个“僵尸网络”(botnet)通过互联网发送大量的请求到特定的目标服务,使其网络出现https://mukrb.lfjmmj.cn/
12.python性能测试手机号验证码登录压测示例详解python压测脚本: threadmark用来标记任务的,我在模块方法里面返回了token,表示唯一用户登录接口请求操作,方便开发追踪日志。 /** * 100个用户通过发短信然后通过验证码登录 */ class LoginByTel extends OkayBase { public static void main(String[] args) { https://m.jb51.net/article/256314.htm
13.短信轰炸机网页版在线短信轰炸机免费短信云呼轰炸机欢迎来到电话测压在线平台,这是一个集电话测压app、电话测压源码、电话测压api、电话测压下载于一体的前沿在线平台,为用户提供基于电话测压的全面解决方案和分析, 特色电话轰炸, 电话测压2022, 电话压测平台, 电话压测网页, 电话压测1.0, 电话压测网站, 艾皇电话测压, 电https://www.brightbikerebel.com/
14.阿里云服务器测试阿里云测试报告综合来看,在压测中,示例中的浏览产品A的API和登录的API,会同时发起压测流量。更多性能测试PTS场景示例,可参考阿里云帮助资料: 性能测试 PTS最佳实践 阿里云短信测试专用是哪里的短信 阿里云服务器里面的短信。阿里云短信测试专用短信是阿里云服务器里面的短信。短信服务是阿里云为用户提供的一种通信服务的能力,分为国内短信http://chengdu.cdxwcx.cn/article/ddojgog.html
15.免费短信压力测试工具灵动短信压力是一款免费的短信压,目前支持安卓平台力测试工具,目前软件接口接近9000接口,不过好多都是失效了,能用,效果不是很强,一通操作下来十来条短信,感兴趣的同学可以试试,软件全部权限拒绝也可正常使用,工具仅供娱乐测试使用,勿用做其他用途哈。 灵动短信压力界面 https://blog.yjscloud.com/archives/387
16.WePush电脑端官方正版2024最新版绿色免费下载安装阿里云短信 阿里大于模板短信 腾讯云短信 华为云短信 百度云短信 又拍云短信 七牛云短信 云片网短信 E-Mail HTTP请求(单次、批量、压测) 计划中支持的消息类型 网易云信短信 榛子云短信 Luosimao短信 极光短信 极光推送 功能介绍 支持自定义消息内容并批量推送 支持变量消息(可实现根据发送目标用户不同每条消息内容不一https://m.liqucn.com/rj/99047.wml
17.在线短信测压平台腾讯云开发者社区Nexmo也提供了一些测试工具和文档来帮助你进行短信测压。 Plivo: Plivo是一个全球性的通信平台,提供短信、语音和电话服务。他们的API功能强大,可以用于发送和接收短信。Plivo也提供了一些测试工具和文档来帮助你进行短信测压。 相关搜索: 在线压测 在线压测工具 在线短信测压平台免费 在线服务器压测 短信测压平台 压测https://cloud.tencent.com/developer/information/%E5%9C%A8%E7%BA%BF%E7%9F%AD%E4%BF%A1%E6%B5%8B%E5%8E%8B%E5%B9%B3%E5%8F%B0-ask
18.WePush(消息推送软件)V4.4.0官方版WePush(消息推送软件)V4.4.0阿里云服务器短信 阿里大于模版短信 腾讯云服务短信 华为云服务短信 百度云盘短信 又拍云短信 七牛云短信 云片网短信 E-Mail HTTP要求(一次、大批量、压测) 方案中支持的消息种类 网易云信短信 榛子仁云短信 Luosimao短信 流星短信 流星推送 【功能介绍】 https://xiazai.zol.com.cn/detail/54/534959.shtml
19.泡泡短信测压下载安装2024泡泡短信测压下载官网版v4.0最新版泡泡短信测压下载安装,泡泡短信测压v4.0是一款免费的手机生活服务应用,提供了不同的手机型号都可以下载来进行测试,用户可以通过软件接收模拟的测试短信,所有的功能都可以用在这里,无论多少条短消息都能快速回复,不仅可以用它来娱乐,非常实用,操作过程充满趣味性,用户只需要在平台里面输入手机号码,欢迎各位用户下载体验!https://www.7xz.com/softs/14224.html
20.Milvus探究与压测分析请输入下面的图形验证码 提交验证 短信预约提醒成功Milvus探究与压测分析 2024-12-01 01:51 关注 1、背景 最近用到了向量搜索,所以要对milvus进行压测。同时为了更加深入分析压测中遇到的问题,也对milvus的部分源码与文档进行了走读。其中遇到了一些问题与疑惑,我们也直接与milvus社区或开源贡献者沟通。 通过压测,我们http://m.528045.com/article/5ef6496f50.html
21.建三江建设局网站/seo包年优化恶意攻击竞争对手,如短信接口被请求一次,会触发几分钱的运营商费用。 进行压测时,用Apache Bench做压力测试。 什么行为判定为刷接口? 接口请求次数多; 接口请求概率频繁,可能1秒上千次; 用户身份难以识别,可能会在刷的过程中随时换浏览器或者ip; 如何判断用户粒度? http://www.pgxk.cn/news/78931.html
22.动态权限多租户数据权限工作流三方登录支付短信RuoYi-Vue 全新 Cloud 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。你的 Star ,是作者生发的动力!https://portrait.gitee.com/cnetly/yudao-cloud
23.手机短信压力测试app压力测试无论是自研还是适配开源的功能,都可以轻松模拟大量用户访问业务的场景,任务随时发起,免去搭建构建足够简单:原生交互0编码及云端录制支持复杂场景,同样支持开源JMeter脚本进行原生引擎压测 发 来自:其他 查看更多 → 配置手机短信登录 配置手机短信登录手机短信是以手机短信形式发送的6位随机数的动态密码,堡垒机系统https://www.huaweicloud.com/theme/344436-3-S-undefined
24.短信网关平台短信软件接入短信验证码短信群发SMSWG短信网关是国内最专业的短信网关平台,特点:短信网关平台免费试用,集群部署日发送量高达1亿次,跨平台成本低(新一代短信网关,不在受限制于windows和linux服务器部署项目),原生java开发,底层采用MQ消息缓存队列。我们提供短信网关,短信运营,短信软件,短信平台,企业级短信https://www.smswg.com/
25.短信群发推广群发国际短信号码空号检测短信服务 国内文本短信调用API或用群发助手,即可发送验证码、通知类和营销类短信;国内验证短信秒级触达,到达率最高可达99% 压测优化服务 技术专家根据实际生产环境的现状对系统的性能测试、综合分析,找出性能瓶颈,提出调优解决方案。 了解详情 迁移服务 https://market.juncdt.com/home/
26.沃联融合短信平台短信网关云通信短信软件沃联融合短信平台是一款专业的短信综合运营管理软件,独立部署,产品化运营,Swoole协程底层技术,负载高,更稳定,极度降低成本。我们提供短信网关,企信通,短信运营,短信软件,短信平台,企业级短信,云通信等服务,短信平台软件哪家好,短信平台软件,群发短信软件,5G短信平台,发短信https://wowlian.cn/sms