# 《Seckill秒杀系统》第79章:限流削峰

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:理解通过限流削峰流量的原理,重点理解并掌握限流在实际项目中的使用方法和落地方案,并能够将其灵活应用到自身实际项目中。

大家好,我是冰河~~

随着互联网的不断发展,几乎所有面向C端和部分面向B端的互联网项目,多多少少都会采用限流的方式来限制流入系统的流量,让真正流入系统的流量是可空的,最大程度避免由于流量过高引起的问题。限流的策略和方式方法就比较多了,有网关限流、API限流、应用层限流、接口限流等等。

# 一、前言

其实,在前面的文章中也提到过:像阿里这种头部互联网公司,其秒杀系统处了会使用上述限流之道进行系统限流外,其处于兼顾用户体验和系统资源的考虑,一般不会采用问答题、验证码或者滑块的方式来打散客户端流量,更倾向于采用非公平的策略,使用有损逐级限流和分层过滤的方式来达到系统限流的目的。

所以,采用限流的方式进行流量削峰,是目前互联网大厂秒杀系统设计过程中,主流的设计方式,大家可以重点掌握下限流的核心原理和落地方案。

# 二、本章诉求

本章,简单介绍下限流的核心原理,秒杀系统的限流以及分层过滤,掌握从服务端角度来讲的一些限流策略,落地方案和方式方法,重点理解限流在实际项目场景下的落地方案,并能够灵活应用到自身实际项目中。

# 三、限流核心原理

限流是系统自我保护的一种有效手段,哪怕系统再厉害,比如,支撑阿里每年双11大促的秒杀系统,总有其承载流量的上限,一旦突破了这个上限,轻则系统卡顿,重则系统直接崩溃宕机,甚至会发生连锁反应,带来灾难性后果。

# 3.1 限流概述

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流。

限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或告知资源没有了)、排队或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货)。

一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如nginx的limit_conn模块,用来限制瞬时并发连接数)、限制时间窗口内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率);其他还有如限制远程接口调用速率、限制MQ的消费速率。另外还可以根据网络连接数、网络流量、CPU或内存负载等来限流。

先有缓存这个银弹,后有限流来应对618、双十一高并发流量,在处理高并发问题上可以说是如虎添翼,不用担心瞬间流量导致系统挂掉或雪崩,最终做到有损服务而不是不服务;限流需要评估好,不可乱用,否则会正常流量出现一些奇怪的问题而导致用户抱怨。

在实际应用时也不要太纠结算法问题,因为一些限流算法实现是一样的只是描述不一样;具体使用哪种限流技术还是要根据实际场景来选择,不要一味去找最佳模式,白猫黑猫能解决问题的就是好猫。 因在实际工作中遇到过许多人来问如何进行限流,因此本文会详细介绍各种限流手段。那么接下来我们从限流算法、应用级限流、分布式限流、接入层限流来详细学习下限流技术手段。

# 3.2 限流算法

常见的限流算法有:令牌桶、漏桶。计数器也可以进行粗暴限流实现

# 1.令牌桶算法

令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下:

  • 假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌;
  • 桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝;
  • 当一个n个字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上;
  • 如果桶中的令牌不足n个,则不会删除令牌,且该数据包将被限流(要么丢弃,要么缓冲区等待)。

# 2.漏桶算法

漏桶作为计量工具(The Leaky Bucket Algorithm as a Meter)时,可以用于流量整形(Traffic Shaping)和流量控制(TrafficPolicing),漏桶算法的描述如下:

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码