什么是流量限制

通俗的说,流量控制就是控制用户请求的策略,主要包括:权限、限流、流量调度。
权限上一篇已经讲过了,这一篇讲限流,下一篇讲流量调度。
限流是指限制用户调用的频率(QPS/QPM)或者次数。

为什么要有流量限制

为了收费

流量限制,站在用户或者运营的角度看,最直观能感受到的作用是 —— 收费。。。
各大主流开放平台的对外API,一般都有一些免费的额度,可以供个人测试用,一旦想大规模调用,就需要付费购买更大的额度(频率、次数),根据调用次数或者频率进行收费。一旦超过拥有的额度,就会被限制调用。

为了保护后面的服务

其实这才是限流最大的用处,只是用户或者运营同学无感,所以不太被大多数人了解。
网关后面是各个服务,各个服务的接口通过网关透出去给用户调用。理论上说,用户的流量是不可预知的,随时可能来一波,一旦流量的峰值超过了服务的承载能力,服务就挂了,比如有大新闻发生时的某浪微博,比如前些年的12306.
所以,网关必须保证,放过去到达后端服务的流量一定不可以超过服务可以承载的上限。这个上限,是网关和各个服务协商出来的。

限流系统设计

由简到难,限流可以分为单机限流、单集群限流、全集群限流。
这里不讨论具体的限流算法,如漏桶、令牌桶等,只说概念和思想。

单机限流

单机限流的思想很简单,就是每个机器的限流值 x 机器数量 = 总的限流值。
举个例子:A用户的QPS限制是100,网关部署了10台机器,那么,每台机器限制10QPS就可以了。
先说好处:
好处就是,实现起来非常简单,每台机器在本地内存计算qps就可以了,超过阈值就拒流。
单机限流的缺陷也十分明显,主要体现在两点:

  1. 当网关部署的机器数量发生变化时,每台机器的限流值需要根据机器数调整。现实中,因为扩容、缩容、机器宕机等原因,机器数的变化是常有的事。
  2. 单机限流的前提是,每台网关承载的用户的流量是平均的,但是事实上,在某些时间,用户的流量并不是完全平均分布在每台机器上的。

举个例子:
10台机器,每台限qps10,其中3台每台实际qps是15,因为超限导致用户流量被拒。其余7台每台qps是7。这样用户总的qps = 15 * 3 + 7 * 7 = 94. 用户qps并没有超限,但是却有一部分流量被拒了,这样就很有问题。
实际上,单台限流的阈值也会设置的稍微大一些,以抵消流量不均的问题。
因为上面的问题,单机限流通常作为一种兜底的备用手段,大多数时候用的还是集群限流。

集群限流

先来看一个示意图:

相比单机限流,集群限流的计数工作上移到redis集群内进行,解决了单机限流的缺陷。
但是集群限流也不是完美的,因为引入了redis,那么,当网关和redis之间的网络抖动、redis本身故障时,集群限流就失效了,这时候,还是得依靠单机限流进行兜底。
也就是说,集群限流 + 单机限流配合,才是一个比稳妥的方案

真·集群限流

接下来我们来思考这样一个问题:大型网关一般都是多机房、多地域部署的,当然,后端的服务也是多机房、多地域部署的,在保护服务这一点来说,集群限流是够用了。但是对用户来说,还是有一些问题:
比如,用户购买的QPS上限是30,我们的网关部署在中国北、中、南三个地域,那么这30QPS怎么分配呢?
平均肯定不行,用户的流量可能是明显不均衡的,比如用户的业务主要集中在中国北方,那么用户的流量大部分都会进入北方的网关,网关如果限制QPS为10的话,用户肯定来投诉。
那每个地域都限制为30行不行?也不行,如果用户的流量比较均匀的分布在各个地域,那么用户购买了30QPS,实际上可能使用了90QPS,这太亏了。。。
按照解决单机限流流量不均的思路,搞一个公共的redis集群来计数行不行?
也不行,受限于信号传播速度和天朝的广阔疆域,每个流量都计数,肯定不现实,rt太高会导致限流失去意义,带宽成本也会变得极其昂贵,对redis的规格要求也会很高。总之,很贵还解决不了问题。
有一种巧妙的解决办法是:本地集群阶梯计数 + 全集群检查。
还是刚才的例子:
限流阈值时90,那么三个地域各自计数,当本地域的数值达到30时,去其他两个地域取一次对方当前的计数值,三个地域的计数值加起来,如果超了,告诉另外两个地域超了,开始拒流。如果没超,本地QPS每上涨10,重复一次上述的动作。
这样就能有效的减少与redis的交互次数,同时实现了全地域真·集群限流。
当然,这种全地域集群限流,因为rt和阶梯计数间隔的存在,一定是不准的,但是,比单集群限流还是好很多。

缓解redis的压力

当某个用户流量特别大的时候,redis计数就会遇到典型的热点key问题,导致redis集群单节点压力过大,有两种办法可以解决这个问题:打散和抽样。

打散

打散是指,把热点key加一些后缀,使其变成多个key,从而hash到不通的redis节点上,均摊压力。
比如热点key是abcd,那么打散后,key变成了abcd1、abcd2、abcd3、abcd4。技术时,轮流加1、2、3、4的后缀就可以了。

抽样

抽样是指,针对热点key,不是每个每个请求到来时都进行计数,而是进行一个抽样,比如每10个请求记一次数,这样redis的压力就会降低到十分之一。

大型API网关(五)—— 限流相关推荐

  1. Redis 集群分布式锁与 API 网关分布式限流

    https://www.infoq.cn/article/FoQGIk*BzdQWJJ0tKqrJ Redis 集群的历史 Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twempr ...

  2. NET CORE 基于缓存策略的SignalR控制推送频率(每多少秒/多少次)API接口控制(限流)...

    ASP.NET Core SignalR 概述,自行去官网搜. SignalR 没有控制和前端推送频率的功能,就是后端一旦发送请求,前端立马响应.或者前端发送请求,后端立马响应,但是如果误操作,或者业 ...

  3. 大型API网关(八)—— 超卖和资源隔离

    超卖 1. 例子 先举个超卖的例子,解释一下什么是超卖. 小高去某运营商办了宽带,100M的,很兴奋,想着看视频肯定不卡了.结果到了晚上,刷视频时,又卡成狗. 第二天白天就又变好了,这是咋回事呢? 聪 ...

  4. 大型API网关(六)—— 监控和预警

    为什么监控和预警对网关如此重要? 因为网关的流量太大了 对上百万QPS的系统来说,即使故障只持续1分钟,其造成的影响也是巨大的,网关一旦发生故障,都是大事件.所以,必须有完善的监控,才能第一时间发现并 ...

  5. java 限流熔断_SpringCloud Alibaba微服务实战五 - 限流熔断

    简介 Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来维护系统的稳定性.在SpringCloud体系中,sentinel主要 ...

  6. 秒杀项目之网关服务限流熔断降级分布式事务

    目录 一.网关服务限流熔断降级 二.Seata--分布式事务 2.1 分布式事务基础 2.1.1 事务 2.1.2 本地事务 2.1.3 分布式事务 2.1.4 分布式事务场景 2.2 分布式事务解决 ...

  7. 京东大型API网关实践之路

    概述 1.背景 京东作为电商平台,近几年用户.业务持续增长,访问量持续上升,随着这些业务的发展,API网关应运而生. API网关,就是为了解放客户端与服务端而存在的.对于客户端,使开放给客户端的接口标 ...

  8. 基于gateway网关实现限流

    前言 在前面的限流方案介绍中,我们谈到了网关在微服务体系架构中的重要作用,网关不经具备大家熟知的动态路由,请求拦截等功能外,还可以基于网关实现分布式环境下的限流,下面我们以gatway为例,用代码进行 ...

  9. SpringCloud Gateway 服务网关,限流

    SpringCloud Gateway 提供了基于Redis 和lua脚本实现的令牌桶算法进行限流,即 RequestRateLimiterGatewayFilterFactory类,通过设置过滤器实 ...

最新文章

  1. 关于SQLServer2000的全文检索使用心得
  2. ICCV 2017 DSiam:《Learning Dynamic Siamese Network for Visual Object Tracking》论文笔记
  3. shell 获取命令执行结果_java高并发系列 第31天:获取线程执行结果,这6种方法你都知道?...
  4. LinkedList剖析
  5. SQL多列查询最大值
  6. 7 种分布式全局 ID 生成策略,你更爱哪种?
  7. HDU 3333 Turing Tree(树状数组/主席树)
  8. C++传入任意的函数类型作为参数
  9. java react_2019JAVA最新课程-React从入门到实战(新)
  10. 2017 Multi-University Training Contest - Team 5:1001. Rikka with Candies(手写bitset)
  11. mysql技术blog_Mysql技术 - 包子博客 _ 关注互联网前端、开发、SEO、移动互联网应用技术...
  12. GoogleTest测试框架介绍(一)
  13. window.showModalDialog用法
  14. Flat-Lattice-Transformer项目经验教训
  15. sqlserver 2000 安装后本机如何连接_3030铝型材框架上的角槽连接件是如何安装固定的?...
  16. 数学建模:Leslie离散人口发展模型
  17. AppInventor开发环境搭建
  18. 什么是diff算法?
  19. C语言:鸡兔同笼问题(基础代码)
  20. 安卓手机误删文件恢复

热门文章

  1. zabbix Linux 线程,zabbix性能优化小结
  2. 为什么要学Linux系统
  3. java -jar 远程调试_java笔记:远程调试
  4. 国人自造龙芯上网本逸珑8089详尽评测
  5. css字体导入和应用
  6. Flink Catalog介绍
  7. 【小白做科研( 九 )】炼丹小记
  8. wise care 365下载|wise care 365 pro绿色便携版v5.0.1下载
  9. 对计算机知识体系的了解,浅浅而谈计算机专业知识体系(对要进入计算机专业学习的人的小小建议)...
  10. UE4地编基础-入门