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


前情提要

上一篇文章里简单介绍了什么是Web API的速率限制,和限速策略需考虑的问题,最后还介绍了ASP.NET Core 的一个常用限速库。。。。。。。的名字。

实施策略


如果你想要建立一个限速系统,首先要确保限速系统不会增加API的响应时间。为了保证高性能和横向扩展性,很多人都会采用像Redis一样的内存数据存储来做限速器。因为Redis的读写速度很快,并且善于用作计数器。

限速

算法


限速算法有很多,这个系列文章将会介绍如下三种限速算法:

  • 令牌桶

  • 固定窗口计数器

  • 滑动窗口计数器

今天介绍第一种:令牌桶算法。

640?wx_fmt=jpeg

令牌桶算法

    令牌桶算法,英文是Token Bucket。令牌桶算法可以保持稳定的流量上限,同时也允许偶尔的流量爆发。    

我们可以通过下面这个类比来进行解释,有一个容量有限的桶,令牌以固定的速率添加到这个桶里面。由于桶的容量是有限的,所以不可能无限制的往里面添加令牌,如果令牌到达桶的时候,桶是满的,那么这个令牌就被抛弃了。每次请求,n个数量的令牌从桶里面被移除,如果桶里面的令牌数少于n,那么该请求就会被拒绝。

640?wx_fmt=png

举个例子

比如说你想把API的速率限制到每分钟20次,同时允许偶尔的流量爆发,最大不超过每分钟50次。那么你可以使用一个Key-Value的内存数据存储,例如Redis,然后:

  1. 用户的第一次请求时,初始化一个桶,它能装50个令牌,把请求的时间戳和令牌的数量存在Redis里,使用用户ID作为Key。

  2. 在后续的请求里,按照预定的固定速率和上次请求后经过的时间向桶里面填充新的令牌。

  3. 然后从桶里面删除一个令牌,并把时间戳更新为现在的时间。

  4. 最后,如果可用的令牌数为0,那么拒绝请求。

640?wx_fmt=png

下回讲:

2019-05-20

固定窗口计数器算法

.NET Core Rocks!!! \m/

640?wx_fmt=jpeg



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

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

相关文章

AGC023F - 01 on Tree

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

让 Ocelot 与 asp.net core “共存”

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

AGC024E - Sequence Growing Hard

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

Xamarin中国峰会2019

Xamarin跨平台技术中国峰会将讨论Xamarin技术的国内最新发展和实践情况,在会议中领略现代化的开发模式、应用基础架构、企业应用转型和案例交流。本月26日,Xamarin中国峰会将以线上直播的形式和大家见面!直播时间:2019年5月26日 8:00—17:00直…

博弈论练习1

博弈论练习1 \;1.ProjectEuler306 Paper-strip Game 题目描述 Solution 令SG[i]SG[i]SG[i]表示连续iii个格子的SGSGSG值。 SG[0]SG[1]0SG[i]mexj0n−2{SG[j]xorSG[i−j−2]}SG[0]SG[1]0 \\ SG[i]mex_{j0}^{n-2}\{SG[j]\;\;xor\;\;SG[i-j-2]\} SG[0]SG[1]0SG[i]mexj0n−2​{S…

.NET Core IoT 入门指南:(三)使用 I2C 进行通信

什么是 I2C 总线I2C 总线(Inter-Integrated Circuit Bus)是设备与设备间通信方式的一种。它是一种串行通信总线,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展[1]。I2C 总线包含两根信号线,一根…

圆方树

圆方树 单纯贴个板子。。。 https://loj.ac/problem/2587 #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algor…

浅淡Kubernetes 与容器技术体系的最佳方法

我们已经进入到容器化时代&#xff0c;Kubernetes成为了市场上容器编排的事实标准&#xff0c;而且k8S 同样具备了微服务所需要的服务注册与发现、负载均衡、配置中心。Spring cloud 的核心是Netflix微服务框架&#xff0c;非常成熟&#xff0c;但是在netflix oss开发初期&…

单位根反演题单

单位根反演题单 LOJ#6485. LJJ 学二项式定理 单位根反演。 bzoj 3328 PYXFIB 单位根反演矩阵乘法。 POJChallengeRound2 Guideposts 求图上路径长度为k的倍数的方案数。 单位根反演矩阵乘法。 #include <vector> #include <list> #include <map> #inc…

.NET Core 批量重置 Azure Blob Storage 的 mime type

点击上方蓝字关注“汪宇杰博客”我的博客使用 Azure Blob Storage 存储文章配图&#xff0c;结果今天玩 Azure CDN 的时候爆了&#xff0c;原因是图片mime type不对。我们来看看如何在 .NET Core 里批量重置 Azure Blob Storage 中文件的mime type吧。起因使用编程方式&#xf…

AGC026E - Synchronized Subsequence

AGC026E - Synchronized Subsequence 题目描述 Solution 定义cnt[x][0],cnt[x][1]cnt[x][0],cnt[x][1]cnt[x][0],cnt[x][1]表示在前xxx个数中0的个数和1的个数分别是多少。 然后把整个串sss划分为若干个子串&#xff0c;划分点在所有cnt[i][0]cnt[i][1]cnt[i][0]cnt[i][1]c…

[NewLife.XCode]实体工厂(拦截处理实体操作)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

AGC027D - Modulo Matrix

AGC027D - Modulo Matrix 题目描述 Solution 有一个显然的想法是先填一部分格子&#xff0c;剩下的格子的即为相邻格子的LCM1LCM1LCM1&#xff0c;但这样填写的数呈指数级增长&#xff0c;并不优秀。 我们发现一个格子的数是否可以填写只和相邻的四个格子有关系&#xff0c…

DDD该怎么学

2006年&#xff0c;国内的互联网才刚刚萌芽&#xff0c;人们甚至还不习惯网购&#xff0c;大多数在校生都在宿舍里刷魔兽世界副本。但企业软件开发却得到了蓬勃发展&#xff0c;各种公司和事业单位都纷纷进行信息化转型。然而人们很快发现&#xff0c;企业应用业务逻辑的复杂度…

博弈论练习2

博弈论练习2 \;1.AGC010F - Tree Game 题目描述 Solution 一道简单博弈题&#xff08;不知道为啥能作为AGC的F题&#xff09;。 考虑树形dpdpdp&#xff0c;设f[x]f[x]f[x]表示以xxx为根的子树中是否先手必胜。 则f[x]1f[x]1f[x]1当且仅当能找到xxx的子节点vvv满足f[v]0f[v…

Net Core下使用RabbitMQ比较完备两种方案(虽然代码有点惨淡,不过我会完善)

一、前言上篇说给大家来写C#和Java的方案&#xff0c;最近工作也比较忙&#xff0c;迟到了一些&#xff0c;我先给大家补上C#的方案。二、使用的插件HangFire一个开源的.NET任务调度框架&#xff0c;最大特点在于内置提供集成化的控制台,方便后台查看及监控&#xff0c;支持多种…

利用ASP .NET Core的静态文件原理实现远程访问Nlog日志内容及解决遇到的坑

最近项目上试运行发现&#xff0c;很多时候网站出了问题或者某个功能不正常&#xff0c;常常需要运维人员去服务器里面查看一下日志&#xff0c;看看日志里面会产生什么异常&#xff0c;这样导致每次都要去远程服务器很不方便&#xff0c;有时服务器是客户保管的不能让我们随意…

后缀数组SA

后缀数组SA 模板 花了不少时间才理解倍增求SASASA的实现方法&#xff0c;我还是太菜了。 定义sa[i]sa[i]sa[i]表示排名为iii的后缀的起始位置。 定义rank[i]rank[i]rank[i]表示起始位置为iii的后缀的排名。 显然两者之前互逆。 void solve() {int m122;for (int i1;i<m;…

使用.NET Core 编写端到端测试

什么是端到端测试端到端测试也称E2E,与单元测试、集成测试、组件测试、契约测试相比&#xff0c;端到端测试的目的是验证整个系统是否满足业务目标&#xff0c;而不管使用的组件架构如何&#xff0c;为了实现这一点&#xff0c;系统被视为一个黑盒子&#xff0c;测试尽可能多地…

Manacher

Manacher(马拉车算法) Manacher算法主要用于求解回文串问题&#xff0c;能够统计出以每一个位置为中心的回文串的个数&#xff0c;效率极高。 模板 题目描述 Manacher算法的实现过程&#xff1a; 1.在字符串每两个字符之间插入一个分隔符。 2.iii从111到nnn求解P[i]P[i]P[i…