如何设计秒杀服务的限流策略

如何保证在流量突增的情况下,仍然保证系统的稳定性。

通过限流策略抵御秒杀期间的流量峰值。

当海量请求到来时,可以对请求进行层层限流、层层拦截,最终将海量请求削减成服务器能够处理的请求数。

尽早限流,上游拦截的越多,下游的请求越少

比如要设计一个秒杀购物电商网站的限流。

第一层限流:合法性限流

仅仅限制那些合法的用户请求能够抵达到秒杀服务器,将一些非法的请求全部拦截掉。

哪些是非法的呢?比如刷单用户,机器脚本

机器脚本 -> 限制手段是验证码

验证码也可以拉长用户的使用时间,降低流量的峰值。

比如下单的时间是毫秒级别,或者反复购买一件商品,可以断定下单的是机器人。

还有一种作法是隐藏入口

第二层限流,负载限流:

集群的一些工具,比如Nginx,LVS


建议使用单一一层的负载,如果每一级都负载,会增大网络请求,造成请求时间过长

前面两者是软件进行负载,也就是软负载。

还有硬件负载,比如

前两层限流都是将流量抵挡在抵达服务器之前

第三层限流,web服务器本身的限流:

比如设置Web服务器的最大链接数

还可以代码上设置一个令牌,抢到令牌的可以进行操作

还可以使用队列进行限流,这里的队列主要是消息队列

还可以使用缓存限流:

限流的本质是为了不断削减请求的数量,而缓存的作用是为了减少用户请求服务端的数量

为了有效的使用缓存进行限流,需要将系统设计为前后端分离或者叫动静分离的结构,

html缓存在客户端本地,大的文件比如图片、视频等可以OSS、CDN

动态缓存可以先缓存在本地的服务器之中,再缓存到由Redis组成的远程集群之中

但是缓存也不能设置多,要考虑多级缓存的数据一致性的问题,缓存的级别越多,一致性的问题就越严重。

不要盲目地进行技术的堆砌,对于大部分系统而言,我们使用静态缓存加上二级动态缓存就已经足够了。

总的来说,静态缓存可以将大量的静态资源缓存在服务器以外的地方,

而动态缓存可以很大程度上减少请求数据库的次数

监控限流:

CPU、内存、并发量等,都是衡量系统稳定性的指标

可以创建一些线程,来监控这些指标,当CPU使用率过高时,就可以临时性的采取服务降级或拒绝策略,比如把一些非核心的业务先临时关闭,从而为系统节约出一部分资源来。

之后可以恢复这些业务。

总结:

你可能感兴趣的:(如何设计秒杀服务的限流策略)