Web API 速率限制(一)


导读

当您API有大量消费者或者请求量猛增到影响程序可用性的时候,您可能需要对API进行速率限制。所以对API进行限速的在于:在增加可靠性和可用性的同时来保护基础架构,你不希望某个恶意的API消费者或者差劲的API客户端开发者通过Dos攻击把你的应用搞垮;保护你的产品,你同样不希望你的产品被滥用,例如大规模用户注册或创建很多垃圾内容。

什么是限速


限速(Rate-Limiting)系统可以控制网络接口发送和接受流量的速率。对于Web API来说,限速系统被用来控制一段时间内某个程序或客户端允许调用某个API的次数,超过该次数的流量会被拒绝。例如Github的API只允许开发者每小时发送5000次请求。

640?wx_fmt=jpeg

限速

策略


在对API限速之前,您首先要考虑好限速的策略,通常一个好的限速策略有以下这两个特性:

  • 易于理解,易于解释,易于使用

  • 针对特殊情况,对开发者可以不限速

限速策略需考虑这些

限速策略还需要考虑这些问题

  1. 颗粒速率限制还是全局速率限制

    针对比较简单的系统,很多开发者采用的是全局速率限制,但是如果某个API消费了大量的资源,你可能需要为每个API单独进行速率限制。所以颗粒的速率限制会保护你的基础架构不被任何耗资巨大的API节点所引起的无理流量尖峰造成严重影响。

  2. 测量每个用户、应用、客户端

    你想要进行速率限制的资源还依赖于您的API的身份认证方式。需要用户身份认证的API通常可以按照用户进行速率限制,而需要应用身份认证的API通常是基于每个应用来进行速率限制。对于未认证的API,我能想到的就是按照IP地址进行速率限制。

  3. 是否支持突发流量

    有些API,尤其是企业内部的系统,需要支持超过速率限制的突发流量。这种情况下,可以采用令牌桶算法(Token Bucket)来实现速率限制。

  4. 是否允许例外

    有时候,对于应用的开发者来说,一个限速策略或一组限速策略可能都不太适用。对于你信任的开发者,如果他们的请求超出了配额,可能需要给他们一些例外的允许,但是在此之前,你要做这些工作:

    1. 保证每个开发者的用例对客户来说都是合理有益的。

    2. 要确认确实没有其它不超出约束的办法来达到相同的目的。

    3. 确保你的基础架构确实可以支撑想要请求的速率。

针对 ASP.NET Core Web API

针对ASP.NET Core Web API项目,如果不采用网关的话,我使用的是:

AspNetCoreRateLimit

Github的地址是:

https://github.com/stefanprodan/AspNetCoreRateLimit。

这个我会在后续文章中介绍。

针对API网关

.NET Core的Ocelot网关内置速率限制功能。

https://ocelot.readthedocs.io/en/latest/features/ratelimiting.html

而其它正经的API网关也都有该功能,例如Kong等。Kong的官网有一篇介绍API速率限制算法的文章,讲的很好可以看看:

https://konghq.com/blog/how-to-design-a-scalable-rate-limiting-algorithm/

我也会在下一篇文章中介绍API速率限制的几种算法。

且听下回分解

2019-05-19

.NET Core Rocks!!! \m/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

训练赛合集

带 # 的为未补 带△的为未补完 带※的为补不动 比赛合集 牛客 △2021年度训练联盟热身训练赛第一场 Codeforces Codeforces Round #694 Div. 2 △Codeforces Round #695 (Div. 2) Codeforces Round #696 (Div. 2) △CodeCraft-21 and Codeforces Round #711 (Div. 2) Codef…

构建简单的微服务架构

前言 本篇仅作引导,内容较多,如果阅读不方便,可以使用电脑打开我们的文档官网进行阅读。如下图所示:文档官网地址:docs.xin-lai.com目录总体介绍微服务架构的好处 微服务架构的不足(这个时候…

[AGC026D]Histogram Coloring

[AGC026D]Histogram Coloring 题目描述 题面 题意大概是有一个nnn列网格图,给定一个长度为nnn的序列hih_ihi​,第iii列只保留这一列最下面的hih_ihi​个格子。 现在需要给这些保留下来的格子染成红色或蓝色,满足每一个完整的222222正方形…

每日训练赛

文章目录说明2021.9.242021.9.252021.9.262021.9.272021.9.282021.9.292021.9.302021.10.12021.10.22021.10.32021.10.42021.10.52021.10.62021.10.72021.10.82021.10.92021.10.132021.10.152021.10.162021.10.212021.10.222021.10.242021.10.252021.10.262021.10.29说明 记录…

读《代码整洁之道》

什么是整洁代码代码的质量非常重要,糟糕的代码有可能会毁了一个公司。对于一个很注重代码质量的人来说呆在一个只关注交付而不关注代码质量的公司是很痛苦的。什么是整洁的代码,不同的人又不同的定义。我认为整洁的代码应该是符合所使用语言代码规范的&a…

[ZJOI2016]小星星

[ZJOI2016]小星星 题目描述 luogu题面 给定一个n个点的树和n个点m条边的无向图,求将树嵌入图的方案数。 其中 n≤17,m≤n∗(n−1)2n \leq 17,m \leq \frac{n*(n-1)}{2}n≤17,m≤2n∗(n−1)​。 Solution 点数很少,考虑状压DP。 令f[i][j][k]f[i][j]…

在 DotNetty 中实现同步请求

一、背景DotNetty 本身是一个优秀的网络通讯框架,不过它是基于异步事件驱动来处理另一端的响应,需要在单独的 Handler 去处理相应的返回结果。而在我们的实际使用当中,尤其是 客户端程序 基本都是 请求-响应 模型,在发送了数据时候…

BZOJ#3252. 攻略

BZOJ#3252. 攻略 题目描述 Solution 有一个显然的 贪心,每次选取一个到根的点权和最大的点xxx,将答案加上xxx到根的路径的点权和,并将xxx到根的路径上的点的权值清零。 可以使用DFS序线段树维护。 但完全没有这么麻烦。 容易发现每一次选…

ASP.NET Core 中间件

1.前言中间件(middleware)是一种装配到应用管道以处理请求和响应的组件。每个组件:●可选择是否将请求传递到管道中的下一个组件。●可在管道中的下一个组件前后执行工作。请求委托(request delegates)用于建立请求管道…

P3899 [湖南集训]谈笑风生

P3899 [湖南集训]谈笑风生 题目描述 Solution 我们考虑离线询问,将询问放在相对应的子树ppp中计算答案。 显然a,b,ca,b,ca,b,c的位置关系有两种情况: bbb是aaa的祖先,ccc是aaa的子孙。aaa是bbb的祖先,ccc是bbb的子孙。 第一种…

.Net Core实现的文档数据库RavenDb

说到文档数据库,大家能想到很多,MongoDb,coudDb。如果只是文档的话,甚至可以使用对象存储,阿里的oss,腾讯cos。但是这里小编选择这RavenDb,原因是对象存储下行太贵了(来自穷逼的绝望)。MongoDb据说非常占用…

bzoj4543. [POI2014]Hotel加强版

bzoj4543. [POI2014]Hotel加强版 题面描述 Solution 先看n≤5e3n \leq 5e3n≤5e3怎么做。 考虑树形dpdpdp。 设f[i][j]f[i][j]f[i][j]表示以iii为根的子树中,深度为jjj的结点个数。 设g[i][j]g[i][j]g[i][j]表示以iii为根的子树中的二元组(x,y)(x,y)(x,y)数量&a…

Web Template Studio 发布!在 VS Code 中轻松创建 Web 应用

作为一个 Web 应用开发者,Scaffolding Tool(脚手架工具)一定是在创建项目时的重要工具。许多开发者会习惯于使用基于 CLI 的脚手架工具来创建 Web 应用,也有许多开发者喜欢使用类似于 VS IDE 的基于 UI 的 Wizard 向导。近期&…

AGC022E - Median Replace

AGC022E - Median Replace 题面描述 Solution 直接构造自动机&#xff0c;模拟每次在末尾加一个字符的当前状态的方案数f[state]f[state]f[state]&#xff0c;状态很少&#xff0c;直接打表转移即可。 时间复杂度O(n)O(n)O(n)。 #include <vector> #include <lis…

再多迷茫,不如静下来好好学习

背景前不久&#xff0c;我有幸看到了CSDN知名博主“沉默王二”写的一篇博客《你的青春&#xff0c;值得先给小型创业公司吗&#xff1f;》&#xff0c;这篇博客介绍了他从苏州回到内地小城洛阳之后&#xff0c;虽然远离了互联网的主阵地&#xff0c;但是依然保持学习的态度&…

AGC023D - Go Home

AGC023D - Go Home 题目描述 Solution 我们首先把这些人分成在sss左边和在sss右边两类&#xff0c;考虑最左边的一群人AAA和最右边的一群人BBB&#xff0c;这两群人中必然有其中一群人是最后到家的。而是否最后到家取决于这两群人的人数&#xff08;因为倘若只剩下两群人&am…

Web API 速率限制(二)- 令牌桶算法简介

前情提要上一篇文章里简单介绍了什么是Web API的速率限制&#xff0c;和限速策略需考虑的问题&#xff0c;最后还介绍了ASP.NET Core 的一个常用限速库。。。。。。。的名字。实施策略如果你想要建立一个限速系统&#xff0c;首先要确保限速系统不会增加API的响应时间。为了保证…

AGC023F - 01 on Tree

AGC023F - 01 on Tree 题目描述 Solution 有一个奇妙的贪心思路。&#xff08;奇妙的原因是我不会证&#xff09; 这一题的结点需要按拓扑序排序&#xff0c;并让逆序对个数最小。 考虑在儿子向父亲合并的过程中统计答案&#xff0c;产生的逆序对个数就是cnt[father][1]∗cn…

让 Ocelot 与 asp.net core “共存”

Intro我们的 API 之前是一个单体应用&#xff0c;各个模块的服务是通过 Assembly 集成在一起&#xff0c;最后部署在一个 web server 下的。我们已经在拆分服务并且在 Ocelot 的基础上封装了我们自己的网关&#xff0c;但是服务还没有完全拆分&#xff0c;于是有这么一个需求&a…

AGC024E - Sequence Growing Hard

AGC024E - Sequence Growing Hard 题目描述 Solution 我们可以把问题看成如下形式&#xff1a; 你有一个空序列&#xff0c;每次要加入一个元素xxx,x∈[1,k]x \in [1,k]x∈[1,k]&#xff0c;使得新的序列字典序比上一个序列的字典序大。 显然如果我们加入一个数xxx&#xf…