在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流
缓存: 缓存的目的是提升系统访问速度和增大系统吞吐量。
降级: 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开。
限流: 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。
接口限流的常用算法:
0x00 计数器法
计数器法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,A接口1分钟内的访问次数不能超过100个。那么可以这么做:在一开始的时候,设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个请求的间隔时间还在1分钟之内,那么说明请求数过多;如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置counter,具体算法如下:
class CounterDemo{
private $first_request_time;
private $request_count = 0; //已请求的次数
public $limit = 100; //时间窗口内的最大请求数
public $interval = 60; //时间窗口 s
public function __construct() {
$this->first_request_time = time();
}
public function grant(){
$now = time();
if($now < $this->first_request_time + $this->interval){
//时间窗口内
if($this->request_count < $this->limit) {
$this->request_count++;
return true;
}else{
return false;
}
}else{
//超出前一个时间窗口后, 重置第一次请求时间和请求总次数
$this->first_request_time = $now;
$this->
本文发布于:2024-02-05 06:53:13,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170726744364127.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |