业务场景 [图片] 红色标块 表示可能出现的并发较高的地方,详情页可能会不断刷新,或许系统时间,因为Java `new`一个对象返回并不耗计算时间,这个操作可以1秒完成几亿次,地址暴露接口和执行秒杀接口是性能瓶颈。 秒杀列表页 [图片] 秒杀详情页 [图片] 用户会一直刷新秒杀详情页直到有秒杀的按钮为止 针对这种用户行 ..

Java 高并发秒杀 API 性能瓶颈分析

本贴最后更新于 805 天前,其中的信息可能已经斗转星移

业务场景

d552b1748a1545c4a829f8f159a50739.png

红色标块 表示可能出现的并发较高的地方,详情页可能会不断刷新,或许系统时间,因为Java `new`一个对象返回并不耗计算时间,这个操作可以1秒完成几亿次,地址暴露接口和执行秒杀接口是性能瓶颈。

秒杀列表页

eaed52612832483ea93c3da16f583320.png

秒杀详情页

d12127d3b55a4798a976fd769071efb5.png

用户会一直刷新秒杀详情页直到有秒杀的按钮为止

针对这种用户行为,设计详情页的静态资源部署在`CDN`上,这样用户就近拿资源,而商品的详情信息则使用Redis内存缓存技术实现从内存中读取,从而减少网络IO时间

c9773e2119fa42938f68a7e44ebde609.png

这里使用了高性能的序列化方案,protostuff,快速压缩和压缩成尽可能小的字节数组
具体的性能对比可以查看[GitHub](https://github.com/eishay/jvm-serializers/wiki)
这里没有做数据更新修改Redis,只是基于超时的缓存修改

对于秒杀操作分析

6f1e745abec84dc583e66488ce82c15e.png
49bf5ea252c14cde8a223fa73e6ac55f.png
5f7a831d24c74d389e607715c01b24ed.png

一般公司解决方案

4ef18b7b5685400397870ead79e4b32a.png
2d21005c47254bee8ba20e2772d63e04.png

本案例中秒杀操作事务分析

9a200e1c33104ed98264ae4308a78da9.png

7ec76e6bc3e24dbb9ee29fc1789242c8.png
7c45031a506e40439d70cbc0fe3ccffb.png

针对以上提出简单的优化

将行级锁操作放到插入购买明细后,使得行级锁等待提交事务的时间变少,调换位置并不影响业务流程

7cd4af1fde97480f8501d003949461f3.png

6a05e34114c6477ea0f175280865c0f0.png

以上方案虽然减少了行级锁等待事务完成的时间,但是还是有 Java 服务端到 MySQL 服务端通信的延迟,而且 Java 自身会有 GC 时间,每次 GC 大概是 50ms

13265e620eab467187a352e84bcdb742.png

以上时间算起来也会在高并发的情况下造成性能瓶颈,那么解决方案是把秒杀操作的执行逻辑放到 MySQL 端,Java 服务端调用存储过程来避免 GC 和延时等待时间

d79d96aa6cd64649830bb878779f2ca4.png

最终大致的优化思路就是这样,以下给出高并发的服务部署方案

2fa4e4e81a4947fda11e24d865c049f6.png

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2579 引用 • 7969 回帖 • 807 关注
  • 并发
    55 引用 • 60 回帖
回帖
请输入回帖内容...