一次线上商城系统高并发优化,涨姿势了~

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 一次线上商城系统高并发优化,涨姿势了~

对于线上系统调优,它本身是个技术活,不仅需要很强的技术实战能力,很强的问题定位,问题识别,问题排查能力,还需要很丰富的调优能力。


本篇文章从实战角度,从问题识别,问题定位,问题分析,提出解决方案,实施解决方案,监控调优后的解决方案和调优后的观察等角度来与大家一起交流分享本次线上高并发调优整个闭环过程。


一 项目简要情况概述


该项目为基于SSM架构的商城类单体架构项目,其中有一个秒杀重磅模块,如下为当前线上环境的简要架构部署图,大致描述一下:


(1)项目为SSM架构


(2)服务器类别:1台负载均衡服务器(F5),3台运用程序服务器,1台计时器服务器,1台redis服务器,1台图片服服务器和1台基于Pass架构的Mysql主从服务器(微软云)


(3)调用逻辑:下图为简要调用逻辑image.png二 何为单体架构项目


从架构发展角度,软件项目经历了如下阶段的发展:


1.单体架构:可理解为传统的前后端未分离的架构


2.垂直架构:可理解为前后端分离架构


3.SOA架构:可理解为按服务类别,业务流量,服务间依赖关系等服务化的架构,如以前的单体架构ERP项目,划分为订单服务,采购服务,物料服务和销售服务等


4 微服务:可理解为一个个小型的项目,如之前的ERP大型项目,划分为订单服务(订单项目),采购服务(采购项目),物料服务(物料项目)和销售服务(销售项目),以及服务之间调用

image.png三 本SSM项目引发的线上问题

问题一:当秒杀的时候,cpu暴增。

该系统每天秒杀分为三个时间端:10点,13点和20点,如下为秒杀的简要页面

图1image.pngimage.pngimage.pngimage.png4.rdis连接数(info clients)

这个未保存截图,记得是600左右

connected_clients:600

5.mysql请求截图

image.png四 排查过程及分析


(一)排查思路。


根据服务部署和项目架构,从如下几个方面排查:


(1)运用服务器:排查内存,cpu,请求数等;


(2)文件图片服务器:排查内存,cpu,请求数等;


(3)计时器服务器:排查内存,cpu,请求数等;


(4)redis服务器:排查内存,cpu,连接数等;


(5)db服务器:排查内存,cpu,连接数等;


(二)排查过程


在秒杀后30分钟内,


1.运用程序服务器cpu暴增,内存暴增,造成cpu和内存暴增的根本原因是请求数过高,单台运用服务器达到3000多;

image.png

2.redis请求超时

image.png3.jdbc连接超时

image.png

4.通过gc查看,发现24小时内,FullGC发生了152次image.png5.再看看堆栈,发现有一些线程阻塞和死锁

jstat -l pid,也可以通过VisualVM分析image.png6.发现有2000多个线程请求无效资源

image.png(三)造成本次系统异常主要因素分析


(1)在秒杀时,请求量过高,导致运用服务器负载过高;


(2)redis连接池满,获取不到连接,connot get a connection from thread pool


(3)jdbc连接池满,获取不到连接和超时


(4)存在大对象代码,如向list集合中不停添加对象,不能及时回收对象导致内存增加,频繁发生Full GC


(5)tomcat并发参数,jvm优化参数,jedis配置参数,jdbc配置参数不合理


(6)未对请求量进行削峰和限流


(7)资源连接未及时释放,如redis连接,jdbc连接未及时释放


五 最终解决方案


1.增加运用服务,做流量削峰和分流


由于该项目未增加MQ,因此只能采用硬负载,增加服务器水平扩展方式来实现流量削峰和流量分流image.png2.优化jvm参数,如下为本次优化后的参数


JAVA_OPTS="-server -Xmx9g -Xms9g -Xmn3g -Xss500k -XX:+DisableExplicitGC -XX:MetaspaceSize=2048m -XX:MaxMetaspaceSize=2048m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"


关于这个jvm参数的优化,jvm理论是怎样的,官方建议是怎样的,实战是怎样的,将在下篇文章中分析。


3.优化tomcat并发相关参数


主要是两方面:


(1)修改bio协议为nio2 (2)根据服务器配置,业务场景,业务流量等合理设置相关参数,尽量达到最优


image.png关于tomcat相关参数优化,在接下来的文章中分析。


4.redis 和jdbc参数优化


由于涉及到安全性问题,这里不列出


5.代码优化


(1)优化掉大对象


(2)优化未及时释放的对象和连接资源


6.解决000多个线程请求无效资源问题


在conf/context.xml增大缓存



cachingAllowed = "true"


cacheMaxSize = "102400"


/>


六 最终优化结果


经过几天观察,系统平稳


1.基本监控image.pngimage.pngimage.pngimage.png七 总结


1.本篇文章从实战角度,从问题识别,问题定位,问题分析,提出解决方案,实施解决方案,监控调优后的解决方案和调优后的观察等角度来与大家一起交流分享本次线上高并发调优整个闭环过程,当然,由于篇幅的限制,


有些细节和优化手段未在本篇文章中提及;


2.虽然解决了该问题,但是从长远来看,该单体项目任然存在很大的问题和隐患,下面随便举几个:


(1)前后端紧耦合,未分离


(2)由于该系统秒杀业务属于非持续性并发,即局部性并发,当前并未做局部并发架构的调整


(3)由于该系统秒杀业务与该项目紧紧耦合在一起,未进行隔离,未独立成单独模块,未单独部署,从而存在因秒杀业务造成整个系统瘫痪的风险;


(4)未做流量削峰和流量限流,如加mq等软手段;


(5)redis未做高可用集群


作者:Alan_beijing

来源:https://www.cnblogs.com/wangjiming/p/13225544.html 近期热文推荐:


1.Java 15 正式发布, 14 个新特性,刷新你的认知!!


2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!


3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。


4.吊打 Tomcat ,Undertow 性能很炸!!


5.《Java开发手册(嵩山版)》最新发布,速速下载!


觉得不错,别忘了随手点赞+转发哦!


image.png


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
相关文章
|
存储 监控 固态存储
在高并发环境下,如何优化 WAL 的写入性能?
在高并发环境下,如何优化 WAL 的写入性能?
|
17天前
|
人工智能 算法 前端开发
超越Prompt Engineering:揭秘高并发AI系统的上下文工程实践
本文系统解析AI工程范式从Prompt Engineering到Context Engineering的演进路径,深入探讨RAG、向量数据库、上下文压缩等关键技术,并结合LangGraph与智能体系统架构,助力开发者构建高可靠AI应用。
132 1
|
3月前
|
缓存 监控 Cloud Native
Java Solon v3.2.0 高并发与低内存实战指南之解决方案优化
本文深入解析了Java Solon v3.2.0框架的实战应用,聚焦高并发与低内存消耗场景。通过响应式编程、云原生支持、内存优化等特性,结合API网关、数据库操作及分布式缓存实例,展示其在秒杀系统中的性能优势。文章还提供了Docker部署、监控方案及实际效果数据,助力开发者构建高效稳定的应用系统。代码示例详尽,适合希望提升系统性能的Java开发者参考。
141 4
Java Solon v3.2.0 高并发与低内存实战指南之解决方案优化
|
3月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
884 7
|
11月前
|
存储 监控 固态存储
在高并发环境下,如何优化 WAL 的写入性能?
在高并发环境下,如何优化 WAL 的写入性能?
162 2
|
8月前
|
存储 缓存 监控
社交软件红包技术解密(四):微信红包系统是如何应对高并发的
本文将为读者介绍微信百亿级别红包背后的高并发设计实践,内容包括微信红包系统的技术难点、解决高并发问题通常使用的方案,以及微信红包系统的所采用高并发解决方案。
241 13
|
8月前
|
弹性计算 NoSQL 关系型数据库
高并发交易场景下业务系统性能不足?体验构建高性能秒杀系统!完成任务可领取锦鲤抱枕!
高并发交易场景下业务系统性能不足?体验构建高性能秒杀系统!完成任务可领取锦鲤抱枕!
|
消息中间件 算法 数据库
架构设计篇问题之商城系统高并发写的问题如何解决
架构设计篇问题之商城系统高并发写的问题如何解决
164 0
|
11月前
|
Java Go 云计算
Go语言在云计算和高并发系统中的卓越表现
【10月更文挑战第10天】Go语言在云计算和高并发系统中的卓越表现
|
11月前
|
缓存 监控 负载均衡
nginx相关配置及高并发优化
Nginx的高并发优化是一个综合性的过程,需要根据具体的业务场景和硬件资源量身定制。以上配置只是基础,实际应用中还需根据服务器监控数据进行持续调整和优化。例如,利用工具如ab(Apache Benchmarks)进行压力测试,监控CPU、内存、网络和磁盘I/O等资源使用情况,确保配置的有效性和服务的稳定性。
392 0