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的主要内容,如果未能解决你的问题,请参考以下文章

Java电商秒杀系统深度优化 从容应对亿级流量挑战

电商秒杀系统设计思路和实现方法

Redis轻松实现秒杀系统

Redis轻松实现秒杀系统

汽车之家电商平台秒杀系统架构实现

电商的秒杀和抢购