秒杀活动是电商项目中常出现的活动。比如演唱会门票抢购,京东淘宝秒杀商品抢购。在抢购那一刻,会有大量用户同时高并发的请求应用系统,可能会达到每秒几万、几十万的请求。如果系统无法处理这么高的请求,那么就会崩溃,从而导致系统不可用。
蒲县网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联于2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联。
对于秒杀活动来说,要求系统不会出现压力过大而崩溃的场景,并且不会出现超卖、少卖的情形。
所以秒杀系统中我们需要思考:
对此我的解决思路是:
秒杀架构图
秒杀架构图如上。
用户发起请求的端口,目前电商项目秒杀活动主要客户端有微信小程序、H5(浏览器)、各平台app(比如Android、iOS、Windows)。我们可以在客户端实现限流机制,这样就可以避免用户发送大量请求到服务端。
客户端的限流可以控制按钮的点击频率,比如对按钮置灰。
我们可以使用Nginx实现请求分流,通过负载均衡将请求均匀的分布到不同的Web节点中。
Nginx也可以作为限流使用。Nginx可以控制单位时间内的请求数,限制同一时间的连接数。
如果实际参与秒杀活动的用户非常大,并发请求非常大。我们就需要在API网关这一层中进行限流,这里可以实现对单个Web节点实现每秒最大请求数限制。
我们也可以控制每个用户的最大请求数,通过Redis记录每个用户的请求数。
在服务层业务中,为减少对数据库的访问,需要进行缓存设计,我们可以使用本地缓存,或者分布式缓存。
队列主要是用来实现流量的削峰填谷,我们可以使用RocketMQ、Kafka等消息中间件作为分布式的队列。
秒杀系统中为什么需要限流?在秒杀活动中商品库存是有限的,而请求的用户数量远远大于商品库存数量。大部分的用户请求实际上是无法抢到商品的无效流量。所以这部分流量可以拦截在上游进行限流。
为了避免用户采用脚本或者频繁点击发送大量请求,而导致其他用户无法正常参加活动,我们也需要控制用户每秒的请求量。
我们可从URI和用户两个方面实行限流。
URI限流示例代码:
用户维度的限流示例代码:
我们获取URI维度的限流器对象uriLimiter,和用户维度的限流器对象userLimiter。如果tryAcquire()成功获得许可,则请求通过,进入后续业务。否则直接报异常,前端界面作相应的友好提示。
使用Redis来存储库存数量,当用户发起抢购请求时,先判断Redis中的库存是否可用。如果可用,将抢购请求放入分布式队列中,采用异步方式处理后续操作,并完成下单。同时在Redis中作库存扣减。
示例代码如下:
先做库存扣减并获取扣减后的库存数量,如果库存数量大于或等于0,将订单创建请求发送到mq。否则返回抢购失败的信息。
消费者创建订单:
关于如何初始化库存?
在抢购活动开始前,有运营人员在后台手动将商品库存从数据库同步到缓存中。库存的扣减在缓存中进行扣减。
利用Redis单线程特性可以实现多线程下安全的库存更新。如果查询缓存中的值时,发现没有,需要从数据库中查询,然后再同步到缓存中,这个过程需要加锁。
示例代码如下:
总结
秒杀设计是典型的高并发系统,关于秒杀系统的设计,经常会在面试中被问到。在设计秒杀系统时,我们需要考虑:
网页标题:一次阿里面试,我被问到了如何设计秒杀系统
本文地址:http://www.csdahua.cn/qtweb/news6/485456.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网