接口限流

为什么需要限流

与用户打交道的服务

比如web服务、对外API,这种类型的服务有以下几种可能导致机器被拖垮

  1. 用户增长过快(这是好事)
  2. 因为某个热点事件(微博热搜)
  3. 竞争对象爬虫
  4. 恶意的刷单

这些情况都是无法预知的,不知道什么时候会有10倍甚至20倍的流量进来,如果遇到此类情况,扩容是根本来不及的,弹性扩容也是来不及的;

对内的RPC服务

一个服务A的接口可能被BCDE多个服务进行调用,在B服务发生突发流量时,直接把A服务给调用挂了,导致A服务对CDE也无法提供服务。 这种情况时有发生,解决方案有两种:

  1. 每个调用方采用线程池进行资源隔离
  2. 使用限流手段对每个调用方进行限流

限流的算法

单机的限流算法有:

  1. 计数器
  2. 令牌桶
  3. 漏桶

1、计数器算法

原理:采用计数器实现限流有点简单粗暴,一般我们会限 制一秒钟的能够通过的请求数。

比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。

实现:对于每次服务调用,可以通过AtomicLong.incrementAndGet()方法来给计数器加1并返回最新值,通过这个最新值和阈值进行比较。

弊端:如果我在单位时间1s内的前10ms,已经通过了100个请求,那后面的990ms,只能眼巴巴的把请求拒绝,我们把这种现象称为“突刺现象”。

2、漏桶算法

为了消除"突刺现象",可以采用漏桶算法实现限流,漏桶算法这个名字就很形象。

原理:算法内部有一个容器,类似生活用到的漏斗,当请求进来时,相当于水倒入漏斗,然后从下端小口慢慢匀速的流出。不管上面流量多大,下面流出的速度始终保持不变。如果容器满了,那么新进来的请求就丢弃。

不管服务调用方多么不稳定,通过漏桶算法进行限流,每10毫秒处理一次请求。因为处理的速度是固定的,请求进来的速度是未知的,可能突然进来很多请求,没来得及处理的请求就先放在桶里,既然是个桶,肯定是有容量上限,如果桶满了,那么新进来的请求就丢弃。

实现:在算法实现方面,可以准备一个队列,用来保存请求,另外通过一个线程池定期从队列中获取请求并执行,可以一次性获取多个并发执行。

弊端:无法应对短时间的突发流量。

3、令牌桶算法

从某种意义上讲,令牌桶算法是对漏桶算法的一种改进,桶算法能够限 制请求调用的速率,而令牌桶算法能够在限 制调用的平均速率的同时还允许一定程度的突发调用。

原理:在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。

放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌,所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置qps为100,那么限流器初始化完成一秒后,桶中就已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求。所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行。

实现思路:可以准备一个队列,用来保存令牌,另外通过一个线程池定期生成令牌放到队列中,每来一个请求,就从队列中获取一个令牌,并继续执行。

集群限流

比如为了限 制某个资源被每个用户或者商户的访问次数,5s只能访问2次,或者一天只能调用1000次,这种需求,单机限流是无法实现的,这时就需要通过集群限流进行实现。

如何实现?为了控制访问次数,肯定需要一个计数器,而且这个计数器只能保存在第三方服务,比如redis。

大概思路:每次有相关操作的时候,就向redis服务器发送一个incr命令,比如需要限 制某个用户访问/index接口的次数,只需要拼接用户id和接口名生成redis的key,每次该用户访问此接口时,只需要对这个key执行incr命令,在这个key带上过期时间,就可以实现指定时间的访问频率。

还可以用消息队列来限流,比如处理大促时的流量削峰。

服务降级

降级指系统将某些业务或者接口的功能降低,可以是只提供部分功能,也可以是完全停掉所有功能。

案例

  1. 双11,订单暂时不允许修改收货地址
  2. 论坛,降级为只能看帖子,不能发帖子
  3. App的日志上传接口,可以完全停掉一段时间,这段时间内APP都不能上传日志

方式

常见的实现降级的方式:独立降级系统。简单一点可以在配置中心配置。

将降级操作独立到一个单独的系统中,可以实现复杂的权限管理、批量操作等功能。其基本架构如下:

熔断

熔断的目的是应对依赖的外部系统故障的情况

案例

  1. A服务的X功能依赖B服务的某个接口,当B服务的接口响应很慢的时候,A服务的X功能响应肯定被拖慢,进一步导致A服务的线程都被卡在X功能处理上,此时A服务的其他功能都会被卡住或者响应非常慢
  2. 加入熔断机制后,A服务不再请求B服务这个接口,A服务内部只要发现是请求B服务的这个接口就立即返回错误,从而避免A服务整个被拖慢甚至拖死

实现

  1. 关键是需要有一个统一的API调用层,由API调用层来进行采样或者统计,如果接口调用散落在代码各处就没法进行统一处理了
  2. 另一个关键是阈值的设计,例如1分钟内30%的请求响应时间超过1秒就熔断,这个策略的“1分钟”“30%”“1秒”都对最终的熔断效果有影响
  3. 实践中一般都是先根据分析再确定阈值,然后上线观察效果,再进行调优

https://blog.csdn.net/bjpowernode_com/article/details/85162473

接口限流、服务降级、熔断相关推荐

  1. 「微服务系列 13」熔断限流隔离降级

    我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...

  2. java 限流熔断_SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断

    前言:除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一.一个服务常常会调用别的模块,可能是另外的一个远程服务.数据库,或者第三方 api 等.例如,支付的时候,可能需 ...

  3. 微服务中的熔断、限流、降级

    在我们进行系统设计时,必须要考虑系统的高性能.高并发.高可用.本文分享的是关于高可用的三大利器:熔断.限流.降级,我们使用通俗.易懂的语句将三个概念讲清楚. 一.熔断 在服务的依赖调用中,被调用方出现 ...

  4. 轻松两步,我在 SpringBoot 服务上实现了接口限流

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视 ...

  5. 熔断,限流,降级 一些理解

    为什么80%的码农都做不了架构师?>>>    1 熔断,限流,降级  2 从微观角度思考   2.1 超时(timeout) 在接口调用过程中,consumer调用provider ...

  6. 微服务接口限流的设计与思考(附GitHub框架源码)

    http://www.infoq.com/cn/articles/microservice-interface-rate-limit?useSponsorshipSuggestions=true&am ...

  7. 高可用服务设计之二:Rate limiting 限流与降级

    <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <nginx限制 ...

  8. 哨兵 双向 java_SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级

    一.基本简介 1.概念描述 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.包括核心的独立类库,监控台,丰富的使用场景验证.(这似乎是阿里开源组件的一贯 ...

  9. 【高并发】高并发五个利器(缓存、限流、降级、熔断、隔离)

    文章目录 文章目录 一.前言 二.缓存 2.1 缓存本质 + 缓存分类 + 缓存三大特征 + 三种淘汰算法 + 根据业务场景设计过期时间 2.2 本地缓存(进程内缓存) 2.3 分布式缓存 2.4 缓 ...

最新文章

  1. ol xyz 加载天地图_OpenLayer学习之加载天地图
  2. 通过MATLAB读取mnist数据库
  3. 关于MetaAPI问题CSDN给的邮件回复
  4. 编译原理实验语义分析_Windows MVSC编译器实现Xtended Flow Guard(XFG)保护机制的原理分析...
  5. 【物联网智能网关-08】TinyGUI和WPF汉字显示技术比较
  6. XPath 元素及属性查找
  7. Android 获取系统签名 并使用系统签名
  8. blast2go mysql_从 Blast2GO 本地化聊一聊 Linux 下 MySQL 的源码安装
  9. SVN提交时出现remains in conflict错误
  10. win7系统如何升级安装win11正式版,win7升级win11系统的方法
  11. 客户机键盘某些键失灵
  12. 电脑打字不显示候选框问题
  13. 【毕业设计】基于spring boot的图书管理系统 -java 计算机 软件工程
  14. 机器学习:线性回归以及非线性回归
  15. centos7 搭建ngnix+vsftp服务器
  16. 串口通信学习(GPS模块)2021.5.10
  17. 开发TI DSP需要知道的
  18. Java 中Calendar日历类的基本使用
  19. 学习OpenBlas
  20. CREO:CREO软件之工程图【插入页面】、【装配图出工程图】、【将视图转为绘制图元】、【工程图输入到CAD中去修改】的简介及其使用方法(图文教程)之详细攻略

热门文章

  1. 【RabbitMq 篇一】-RabbitMq下载与安装
  2. ChIPBase数据库超详细使用指南
  3. 实训笔记:Flume基础 Mac Flume基本使用
  4. 华为旗舰手机升级鸿蒙,华为鸿蒙重磅来袭:今年4月起 华为旗舰手机将陆续升级鸿蒙系统!...
  5. FineBI 6.0入门基础(一)
  6. 记录linux 的chroot
  7. .Net开源工作流,100%源码开放
  8. PP管材改性及新产品运用
  9. TransparentBlt用法
  10. 2009年11月11日,博客更新公告!