快捷搜索: 王者荣耀 脱发

Java实现电商秒杀系统-jseckill

    1.前言

什么是秒杀?双十一,双十二天猫京东优惠大促销,大量的用户去抢夺少量的商品,在段时间内抢完,称之为秒杀。典型的高并发应用场景。

    2.简介

电商秒杀系统,要求并发量特别大,用Java实现秒杀系统,可以很大程度提高自己的高并发架构能力。可能每秒钟用户连接数大概1000以上。需要确保网站后台正常流畅运行,用户抢到的数量和数据库中减少的库存量保持一致,并且数据库中记录秒杀数据不遗漏。并且用户操作不卡顿。jseckill项目,秒杀的英文单词是seckill,前面的j代表用Java语言实现。项目选择了Java语言实现,使用了消息队列,缓存,分布式锁等技术。

    3.技术选型

1.Spring Boot 2.MySQL+MyBatis 3.Redis 4.Thymeleaf 5.Bootstrap 6.RabbitMQ 7.zookeeper实现分布式锁

    4.架构图

系统部署架构图

    5.高并发优化手段

1.动静分离

前端静态文档部署到CDN, 缺少资金的公司可以用把静态资源部署到nginx静态站点上。

动静分离:把静态资源(js,css,图片)直接部署放到nginx, 动态服务还在原有的tomcat/SpringBoot里。nginx能够支持高达 50,000 个并发连接数的响应。远远高于Tomcat(大约几千个连接数,受制于系统对单进程内线程数量的限制),而且nginx很节省内存。

2.使用Google guava的RateLimiter来进行限流

3.暴露秒杀接口,暴露信息,作为不常更新的热点数据,贮存到Redis里

4.Java应用部署多个集群节点,之间使用nginx做负载均衡和反向代理,提高客户端可承载的并发数

5.Redis操作速度远远快于MySQl操作, 先在Redis里进行秒杀,然后发送消息到RabbitMQ。 Redis操作前,需要获取到分布式锁,操作完毕后释放分布式锁,确保同一时刻只会有一个线程操作Redis减库存操作。

6. 从RabbitMQ中一条条的读取消息,并更新到MySQL

减库存时,在同一事务内,先"插入记录",再"更新库存", 能有效减少行锁的作用时间。数据库更新操作,采用乐观锁,提高并发性

    6.后台秒杀过程

1.RateLimiter限流。 并发量大的时候,直接舍弃掉部分用户的请求

2.Redis判断是否秒杀过。避免重复秒杀。如果没有秒杀过,

在Redis操作前分布式加锁 Redis秒杀(减库存,并记录已秒杀成功者的userPhone) 。然后分布式解锁 。

3.发送秒杀记录到RabbitMQ,并且马上返回结果到客户端

4.监听RabbitMQ的队列消息, 一条条地读取消息后,操作数据库。插入秒杀记录和减库存。 并手动ACK队列

    7.源码与交流

GitHub源码(长按网址并复制到浏览器后打开)

https://github.com/liushaoming/jseckill

演示地址

http://jseckill.appjishu.com

经验分享 程序员 微信小程序 职场和发展