专业的编程技术博客社区

网站首页 > 博客文章 正文

「系统架构」如何设计秒杀服务的限流策略

baijin 2024-10-01 07:28:25 博客文章 7 ℃ 0 评论

对于秒杀的流程,相信大家已经比较熟悉了。参与秒杀的商品,价格一般较平时低很多,而且数量也有限。因此,会吸引大量用户在同一时间前去抢购,导致秒杀系统瞬时流量突增。所以,对于秒杀系统,最大的挑战就是如何在流量瞬时突增的情况下,保证系统的稳定性。

针对此情况,目前业内有很多方案可供使用,今天我们要讲的就是如何通过限流策略来抵御秒杀期间的流量峰值,从而保证系统的稳定性。

所谓限流就是通过设置层层关卡,将海量请求削减成服务器可以处理的量。比如,某一次秒杀活动,开始时可能有100万的请求同时扑向服务器,如果从多层限流的角度来说,我们就可以在第一层把流量消减成30万,然后在第二层将流量消减到10万,接着在第三层将流量消减到5万,最后直接将这5万流量发送到服务器进行处理。

秒杀限流分为合法性限流、负载限流、服务限流和监控限流。

合法性限流

所谓合法性限流是指仅仅限制那些合法的用户请求能够抵达秒杀服务器,而将那些非法的请求全部进行拦截掉。比如,我们可以限制刷单用户的请求、机器人的请求,而将普通用户的请求进行放行等。

如何限制非法请求?

对于机器人的请求我们可以使用验证码来限制,而对于刷单用户的请求,我们则可以使用IP、手机号等进行限制。

对于合法性限流,我们还可以使用在秒杀活动开始前,隐藏秒杀服务的地址的方式,在很多时候这也是很有作用的。

负载限流

所谓负载限流就是通过集群和负载均衡将客户端请求负载到多个服务器上,从而达到削减流量的作用。


如上图所示,当客户端有33万请求发送过来时,我们可以通过负载均衡将请求分别发送到3台服务器上,这样每台服务器就只分得了11万请求,相比33万,每台服务器要处理的请求量就大大降低了。

负载均衡分为硬件负载均衡和软件负载均衡,硬件负载均衡有F5和Array,软件负载均衡有Nginx和Lvs。虽然,硬件负载功能很将强大,但是价格比较昂贵,所以,在实际工作中,一般的公司很少使用硬件负载。相对于硬件的昂贵,软件负载就便宜很多,像Nginx和Lvs等开源的负载软件甚至都可以免费使用。也正是软件负载的成本优势,现在很多中小型公司都采用软件负载均衡。

其实在网络七层模型当中的很多层我们都可以进行负载操作,如在数据链路层我们可以使用Mac地址进行负载,在网络协议层我们可以使用IP进行负载,在传输层我们可以使用端口进行负载(如Lvs),在应用层我们可以使用HTTP协议进行负载(如Nginx)等。

因此,很多人说我们是否可以采用级联负载,答案当然是可以的,但是我们要知道,每增加一层负载就要增加一个转发路径,每增加一个转发路径,就可能带来一个网络延迟问题。所以,在实际的工作中,我们是不推荐太多的级联负载的,通常情况下,单独使用nginx或Lvs+Nginx就可以满足大部分公司的业务需求。

服务限流

所谓服务限流就是客户端请求到达业务服务器上的限流,服务限流我们从一下几个方面进行操作:

1、通过服务器的连接数进行限制



如上图所示,我们设置服务器的连接数为300个,当连接请求数大于300,我们可以直接拒绝。

2、通过程序算法进行限制


常用的程序算法有漏斗算法、令牌桶算法,如上图是谷歌提供的令牌桶算法API

3、通过消息队列进行限制



如上图所示,当请求到达服务器时,我们先将所有请求放入消息队列中,然后让各服务器根据自己能力的大小,分别从消息队列中取出一定数量的请求进行处理。如子系统-A能处理2万请求,那就让它从消息队列取出2万请求进行处理。

4、通过缓存来限制

使用缓存限流需要将系统设置成功前端后端分离或动静分离的结构,这样我们才可以针对动态内容和静态内容分别进行缓存处理。



针对静态内容我们可以使用客户端缓存、Nginx服务端缓存、CDN缓存。



针对动态内容我们可以使用服务器本地缓存,如Guava Cache,运程缓存,如Redis、Memcache等。

监控限流

所谓监控限流就是我们通过创建线程监控CPU、内存、并发量等,来了解服务器的状态。当服务器状态异常时,我们可以通过服务降级或拒绝策略,来保证系统的稳定性。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表