最近,被推送了很多秒杀架构的文章,忙里偷闲本身也总结了一下互联网平台秒杀架构设计,固然也借鉴了很多同窗的思路。俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场景,同时跟你们分享交流一下。前端
秒杀场景无非就是多个用户在同时抢购一件或者多件商品,专用词汇就是所谓的高并发。现实中常常被你们喜闻乐见的场景,一群大妈抢购打折鸡蛋的画面必定不会陌生,如此场面让服务员大姐很无奈,遇上不要钱了。java
用户规模可大可小,几百或者上千人的活动单体架构足以能够应付,简单的加锁、进程内队列就能够轻松搞定。一旦上升到百万、千万级别的规模就要考虑分布式集群来应对瞬时高并发。git
通常商家在作活动的时候,常常会遇到各类不怀好意的DDOS***(利用无辜的吃瓜群众夺取资源),致使真正的咱们没法得到服务!因此说高防IP仍是颇有必要的。web
搞活动就意味着人多,接入SLB,对多台云服务器进行流量分发,能够经过流量分发扩展应用系统对外的服务能力,经过消除单点故障提高应用系统的可用性。redis
基于SLB价格以及灵活性考虑后面咱们接入Nginx作限流分发,来保障后端服务的正常运行。spring
分流、分流、分流,重要的事情说三遍,再牛逼的机器也抵挡不住高级别的并发。sql
限流、限流、限流,毕竟秒杀商品有限,防刷的前提下没有绝对的公平,根据每一个服务的负载能力,设定流量极限。数据库
缓存、缓存、缓存、尽可能不要让大量请求穿透到DB层,活动开始前商品信息能够推送至分布式缓存。后端
异步、异步、异步,分析并识别出能够异步处理的逻辑,好比日志,缩短系统响应时间。api
主备、主备、主备,若是有条件作好主备容灾方案也是很是有必要的(参考某年锤子的活动被***)。
整个压测优化过程就是一个不断优化不断改进的过程,事先经过测试不断发现问题,优化系统,避免问题,指定应急方案,才能让系统的稳定性和性能都获得质的提高。
可能秒杀架构原理你们都懂,网上也有很多实现方式,但大多都是文字的描述,告诉你如何如何,什么加锁、缓存、队列之类。但不多全面有的案例告诉你如何去作,既然是从0到1,但愿如下代码案例能够帮助到你。固然最终落实到生产,还有很长的路要走,要根据本身的业务进行编码,实施并部署。
你将会在代码案例中学到如下知识(不按期补充):
├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─itstyle │ │ │ └─seckill │ │ │ │ Application.java │ │ │ │ │ │ │ ├─common │ │ │ │ ├─api │ │ │ │ │ SwaggerConfig.java │ │ │ │ │ │ │ │ │ ├─config │ │ │ │ │ IndexController.java │ │ │ │ │ │ │ │ │ ├─dynamicquery │ │ │ │ │ DynamicQuery.java │ │ │ │ │ DynamicQueryImpl.java │ │ │ │ │ NativeQueryResultEntity.java │ │ │ │ │ │ │ │ │ ├─entity │ │ │ │ │ Result.java │ │ │ │ │ Seckill.java │ │ │ │ │ SuccessKilled.java │ │ │ │ │ │ │ │ │ ├─enums │ │ │ │ │ SeckillStatEnum.java │ │ │ │ │ │ │ │ │ ├─interceptor │ │ │ │ │ MyAdapter.java │ │ │ │ │ │ │ │ │ └─redis │ │ │ │ RedisConfig.java │ │ │ │ RedisUtil.java │ │ │ │ │ │ │ ├─distributedlock │ │ │ │ ├─redis │ │ │ │ │ RedissLockDemo.java │ │ │ │ │ RedissLockUtil.java │ │ │ │ │ RedissonAutoConfiguration.java │ │ │ │ │ RedissonProperties.java │ │ │ │ │ │ │ │ │ └─zookeeper │ │ │ │ ZkLockUtil.java │ │ │ │ │ │ │ ├─queue │ │ │ │ ├─jvm │ │ │ │ │ SeckillQueue.java │ │ │ │ │ TaskRunner.java │ │ │ │ │ │ │ │ │ ├─kafka │ │ │ │ │ KafkaConsumer.java │ │ │ │ │ KafkaSender.java │ │ │ │ │ │ │ │ │ └─redis │ │ │ │ RedisConsumer.java │ │ │ │ RedisSender.java │ │ │ │ RedisSubListenerConfig.java │ │ │ │ │ │ │ ├─repository │ │ │ │ SeckillRepository.java │ │ │ │ │ │ │ ├─service │ │ │ │ │ ISeckillDistributedService.java │ │ │ │ │ ISeckillService.java │ │ │ │ │ │ │ │ │ └─impl │ │ │ │ SeckillDistributedServiceImpl.java │ │ │ │ SeckillServiceImpl.java │ │ │ │ │ │ │ └─web │ │ │ SeckillController.java │ │ │ SeckillDistributedController.java │ │ │ │ │ ├─resources │ │ │ │ application.properties │ │ │ │ logback-spring.xml │ │ │ │ │ │ │ ├─sql │ │ │ │ seckill.sql │ │ │ │ │ │ │ ├─static │ │ │ └─templates │ │ └─webapp
码云下载:从0到1构建分布式秒杀系统