看视频教学不太适合我,眼睛太快,脑子有时跟不上,还是看几遍后花点时间把文字版整理下来,视频来源:https://time.geekbang.org/dailylesson/detail/100044013
当海量请求到来时,我们可以对请求层层设卡,层层拦截,最终将海量请求削减成服务器能够处理的请求数。
在限流时,我们既要层层限流,也要尽早限流,因为上游限制的流量越多,下游的流量就越少。
第一层 合法性限流:
仅仅限制那些合法的用户请求能够抵达到秒杀服务器,而将一些非法的请求全部进行拦截掉。所以在进行合法性限流之前,我们需要清楚,哪些请求是合法的,哪些请求是非法的。
举例来说:秒杀服务中,参与秒杀请求的,可能是人也可能是一些程序脚本,还可能存在同一用户反复购买同一件商品的行为(刷单)。显然,程序脚本和刷单行为都是不合理的行为,针对这些不合法的请求,需要具体问题具体分析:
验证码
假设请求的来源是程序脚本,最简单的方法就是设置验证码,并且验证码还有一个作用,它可以拉长用户的访问时间。架势某一秒钟有 100万 个用户同时下单,假设使用了验证码,那么用户从输入验证码到整个下单的过程,可能需要 3 秒,
那就是说下单量可能还是 100万 不变,但下单的总体时间,可能从 1 秒钟拉长到了 3 秒,原来每秒 100万 的请求,现在每秒就只需要处理 33 万。
IP 限制
如果通过网络技术检测到了某个 IP 的下单频率过快,或者反复购买同一件商品,那么可以简单判定是机器人或者不合法的用户,这样我们可以对这些 ip 加以限制,从而减少不合法的流量达到限流的目的。
隐藏秒杀的入口地址
在秒杀开始之前,服务器并不会向外界暴露秒杀服务的地址。
第二层 负载限流
负载限流的理论基础:集群、网络七层模型
搭建集群时,经常会用到的工作,例如Nginx和LVS(网络端口进行负载),都可以用于负载限流。
在网络七层模型中,Nginx处于第七层,其它层,也可以进行负载。
简单重温一下网络七层模型,由上至下: 应用层(为应用程序提供服务), 表示层(数据格式化转化,数据加密), 会话层(建立、管理和维护会话), 传输层(建立、管理和维护端到端的链接), 网络层(IP 选址以及路由选择), 数据链路层(提供介质访问和链路管理), 物理层
层级负载: 数据链路层(MAC负载) -> 网络层(IP负载) -> 传输层(端口负载) -> 应用层(Nginx负载)
第三层 服务限流
服务器配置合理请求连接数参数、算法限流(令牌桶算法、漏桶算法等)、消息队列、缓存限流
监控限流
创建线程,监控 CPU、内存、并发量等等