高并发优化

2018-02-05  本文已影响16人  8813d76fee36

慕课网Java高并发秒杀API之高并发优化笔记。
基于该系列课程的Demo。

分析高并发发生在哪里

业务流程分析

详情页

详情页容易出现并发。详情页获取当前的系统时间,如果秒杀没有开启会进入到倒计时;如果秒杀已开启,会调用地址暴露接口,用于获取秒杀地址;接着执行秒杀操作,返回结果。
图中红色代表可能发生高并发的点,绿色的部分表示没有影响。


详情页流程图

秒杀地址接口优化

秒杀地址接口优化

秒杀操作优化分析

1、无法使用CDN缓存
2、后端缓存困难:库存问题。在缓存中减库存会产生不一致问题,需要使用关系数据库如Mysql事务保证数据一致性。
3、一行数据竞争:热点商品

其他方案分析

原子计数器管理商品库存,保证原子性;记录行为作为消息放入分布式消息队列中;后端服务消费消息并落地到数据库(如mysql)。


其他案例分析

为什么不用MySQL解决。

java事务行为

当有库存的时候执行库存减一,然后插入购买明细;此时另一个用户也执行减库存,该用户会等待行锁,当之前的事务没有回滚或提交,这个行级锁不会被释放。当上一个用户的insert操作commit或rollback后,后来的用户获得锁并继续执行操作。此时再后面进来的用户会继续等待锁,进而产生串行化的阻塞操作。

瓶颈分析

执行update减库存,将SQL语句发送至MySQL服务器有网络延迟,同时还可能伴有GC(Java垃圾回收机制)操作,新生代GC会暂停所有的事务操作。GC不会每次都出现,但一定会出现。性能瓶颈出现在SQL执行时间、网络延迟和GC时间。

优化方向

行级锁在Commit之后释放,所以优化方向主要减少行级锁的持有时间。

网络延迟分析

延迟分析

系统并发越高,GC运行频率越高。

如何判断update更新库存成功

两个条件:

优化思路:
事务竞争优化,减少事务锁时间。
把客户端逻辑放到MySQL服务端,避免网络延迟和GC影响。

如何放到MySQL服务器端

上一篇 下一篇

猜你喜欢

热点阅读