Spring Cloud+Nginx秒杀实战
在开发高并发系统时用三把利器——缓存、降级和限流来保护系统。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;降级是当服务出现问题或者影响到核心流程的性能时需要暂时屏蔽掉服务请求,待高峰或者问题解决后再打开;
有些场景并不能用缓存和降级来解决,比如稀缺资源(如秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(如评论的最后几页),因此需要有一种手段来限制这些场景的并发请求量,即限流。
本章将通过一个综合性实战——Spring Cloud+Nginx秒杀实战介绍缓存、降级和限流的综合应用。
秒杀系统的业务功能和技术难点
秒杀和抢购类的案例在生活中随处可见,比如:商品抢购、春运抢票、微信群抢红包。
从业务的角度来说,秒杀业务非常简单:根据先后顺序下订单减库存,主要有以下特点:
(1)秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功,这种场景下需要借助分布式锁等保障数据一致性。
(2)秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增,这就需要进行削峰和限流。
秒杀系统的业务功能
从系统的角度来说,秒杀系统的业务功能分成两大维度:
(1)商户维度的业务功能。
(2)用户维度的业务功能。
秒杀系统的业务功能如图10-1所示。
图10-1 秒杀系统的业务功能
1.商户维度的业务功能
商户维度的业务功能主要涉及两个操作:
(1)增加秒杀:通过后台的管理控制台界面增加特定商品、特定数量、特定时段的秒杀。
(2)暴露秒杀:将符合条件的秒杀暴露给用户,以便互联网用户能参与商品的秒杀。这个操作可以由商户手动完成,在生产场景下,更合理的方式是系统自动维护。
2.用户维度的业务功能
用户维度的业务功能主要涉及两个操作:
(1)减库存:减少库存简单来说就是减少被秒杀到的商品的库存数量,这是秒杀系统中的一个处理难点。为什么呢?这不仅仅需要考虑如何避免同一用户重复秒杀的行为,而且在多个微服务并发的情况下需要保障库存数据的一致性,避免超卖的情况发生。
(2)下订单:减库存后需要下订单,也就是在订单表中添加订单记录,记录购买用户的姓名、手机号、购买的商品ID等。与减库存相比,下订单相对比较简单。
说明
这里为了聚焦高并发技术知识体系的学习,对秒杀业务功能进行了瘦身,去掉了一些功能,比如支付功能、提醒功能等。同时,由于商户维度的业务功能比较简单,更多的是模型对象的CRUD操作逻辑,因此这里也对其进行了简化。
秒杀系统面临的技术难题
总体来说,秒杀系统面临的技术难题大致有如下几点。
(1)限流:鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。
(2)分布式缓存:秒杀系统最大的瓶颈一般都是数据库读写,由于数据库读写属于磁盘IO,性能很低,如果能够把部分数据或业务逻辑转移到分布式缓存,效率就会有极大提升。
(3)可拓展:秒杀系统的服务节点一定是可以弹性拓展的。如果流量来了,就可以按照流量预估进行服务节点的动态增加和摘除。比如淘宝、京东等双十一活动时,会增加大量机器应对交易高峰。
(4)超卖或者少卖问题:比如10万次请求同时发起秒杀请求,正常需要进行10万次库存扣减,但是由于某种原因,往往会造成多减库存或者少减库存,就会出现超卖或少卖问题。
(5)削峰:秒杀系统是一个高并发系统,采用异步处理模式可以极大地提高系统并发量,实际上削峰的典型实现方式就是通过消息队列实现异步处理。限流完成之后,对于后端系统而言,秒杀系统仍然会瞬时涌入大量请求,所以在抢购一开始会有很高的瞬间峰值。高峰值流量是压垮后端服务和数据库很重要的原因,秒杀后端需要将瞬间的高流量变成一段时间平稳的流量,常用的方法是利用消息中间件进行请求的异步处理。
本文给大家讲解的内容是高并发核心编程,Spring Cloud+Nginx秒杀实战,秒杀系统的业务功能和技术难点
- 下篇文章给大家讲解的是高并发核心编程,Spring Cloud+Nginx秒杀实战,秒杀系统的系统架构;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!