Java实现电商秒杀系统-jseckill
Posted 开源分布式
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
欢迎在GitHub里面点星星Star,你的Star是对我的很大肯定。
以上是关于Java实现电商秒杀系统-jseckill的主要内容,如果未能解决你的问题,请参考以下文章