Api Blocking

标签: api blocking | 发表时间:2017-02-04 02:36 | 作者:
分享到:
出处:http://xiaobaoqiu.github.io/

1.背景

接口限流是保证系统稳定性的三大法宝之一(缓存, 限流, 降级).

本文使用三种方式实现Api限流, 并提供了一个用Spring实现的Api限流的简单Demo, Demo的git地址: https://github.com/xiaobaoqiu/api-blocking

其中接口限流配置在文件 blocking-config.properties 中, 内容实例如下:

1
2
3
4
5
6
7
8
9
10
11
      # 每一块审核一个限流配置,一块内的起始数字相同,数字依次往下递增
# 每一块由一下四个信息组成:
#   name - 请求url
#   redirectUrl - 请求被阻塞的时候跳转的 url
#   duration,limit - 在 duration 秒的时间内最多访问 limit 次

# 表示接口 /business/detail.json 10 秒只能被访问 2 次, 超过的请求讲被跳转到 /noAuth 上
0.url=/business/detail.json
0.redirectUrl=/noAuth
0.duration=10
0.limit=2

里面包含了三种方式来实现限流, 下面将主要审核分别详细介绍三种方式:

  1.Redis
2.滑动窗口
3.Guava的RateLimiter

2.Redis实现限流

Redis的官网的命令手册的例子就是如何使用 incr 指令实现接口限流.参见官网: https://redis.io/commands/incr/

简单说就是每个请求生成一个key(可以根据IP + 接口url生成, 也可以直接根据接口url生成), value为计数值. 设置过期时间.

需要注意 Redis 的过期策略是混合的:

  1.被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key;
2.主动删除:Redis会定期(默认好像是100ms)主动淘汰一批已过期的key;当已用内存超过限定时, 也会触发主动清理策略;

3.滑动窗口实现限流

大家都知道TCP中的滑动窗口有调节发送速率的作用.这里是一个类似的想法.

按照我们的配置, 我们期望 duration 时间内最多 limit 个请求, 我们可以想象有一个事件窗口, 其宽度就是 duration, 因为每个请求都有一个时间戳(可以用Long表示), 每次请求过来的时候, 我们只需要校验当前请求为尾端的时间窗口内的请求数目是否满足 limit 需求就行了.

实现很简单, 使用一个环形队列就行.具体参考 demo 代码.

4.RateLimiter实现限流

直接使用Guava提供的RateLimiter实现.

RateLimiter的原理参考: http://xiaobaoqiu.github.io/blog/2015/07/02/ratelimiter/

相关 [api blocking] 推荐:

Api Blocking

- - xiaobaoqiu Blog
4.RateLimiter实现限流. 接口限流是保证系统稳定性的三大法宝之一(缓存, 限流, 降级).. 本文使用三种方式实现Api限流, 并提供了一个用Spring实现的Api限流的简单Demo, Demo的git地址: https://github.com/xiaobaoqiu/api-blocking.

Non-blocking JavaScript 的問題 - IE 的 window.onload 事件

- Kejun - 這樣做就對了!
很讚的 Non-blocking JavaScript. 前陣子將網站的所有 JavaScript 採用 Non-blocking 的方式做載入,整個介面 rendering 的時間減少很多,是我們想要的效果:. 但是今天在 IE 發現了一個蠻嚴重的問題:「假設用 Non-blocking 的方式在 head 載入某 JavaScript ,而此 JavaScript 有指定 window 的 load 的事件處理函式,會發現它常常沒有被觸發.

股票API

- 狗尾草 - 博客园-首页原创精华区
股票数据的获取目前有如下两种方法可以获取:. http/javascript接口取数据. 1.http/javascript接口取数据. 以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据. 这个url会返回一串文本,例如:. var hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91, 26.92, .

API 与 ABI

- Ant - A Geek's Page
(本文亦是《C语言编程艺术》中的一部分,所以请勿用于商业用途. 一些程序员居然对API和ABI这两个概念都不清楚,我感到有些惊讶. 这里以 Linux 内核为例简单解释一下. API,顾名思义,是编程的接口,换句话说也就是你编写“应用程序”时候调用的函数之类的东西. 对于内核来说,它的“应用程序”有两种:一种是在它之上的,用户空间的真正的应用程序,内核给它们提供的是系统调用这种接口,比如 read(2),write(2);另一种就是内核模块了,它们和内核处于同一层,内核给它们提供的是导出的内核函数,比如 kmalloc(),printk().

Google+ API发布

- 屁清新健脑 - Solidot
开发者终于等来了期待已久的Google+ API. Google正式发布了允许读取用户公开信息的API,开发者可以借助API开发与Google+交互的应用程序,或将其整合到网站上. Google社交网站发布2个月来,经历了用户暴涨,但也出现了热度下降. Google+ API的发布也许能给予它一个新动力.

Windows API 调用监视工具 API Monitor

- 简单香草 - 开源中国社区最新软件
API Monitor 是一款用来监视和显示用户应用程序和服务程序中的Windows API调用的免费软件. 它是一个强大的工具,在跟踪调试你开发的应用程序时,可以帮助发现产生问题可能的原因. API Monitor支持windows 7及windows 64位系统.

Java API 设计清单 « 友好的API

- - 东西
在设计Java API的时候总是有很多不同的规范和考量. 与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度. 就像飞行员起飞前的检查清单,这张清单将帮助软件设计者在设计Java API的过程中回忆起那些明确的或者不明确的规范. 本文也可以看作为“ API设计指南”这篇文章的附录. 我们还准备了一些前后比对的例子来展示这个列表如何帮助你理清设计需求,找出错误,识别糟糕的设计实践以及如何寻找改进的时机.

MongoDB REST Api介绍

- peigen - NoSQLFan
MongoDB默认会开启一个HTTP协议的端口提供REST的服务,这个端口是你Server端口加上1000,比如你的Server端口为27017,那么这个HTTP端口就是28017,默认的HTTP端口功能是有限的,你可以通过添加–rest参数启动更多功能. 下面是在这个端口通过其RESTFul 的API操作MongoDB数据的几个例子,来源是MongoDB官方文档.

Google Reader API简介

- Mooky - keakon的涂鸦馆
Google Reader是我最喜欢的web服务,可惜在iPhone上没有一个我理想中的客户端,所以只好自己动手丰衣足食了. 而开发的第一步自然就是搞定Google Reader API,可惜Google一直没有放出官方文档. 所幸的是前人已经通过反向工程探寻出了相关信息(GoogleReaderAPI、Using the Google Reader API和GReader-Cocoa等),所以不用自己去一一摸索了.

Twitter API中文文档

- Jacob - 月光博客
  目前的国内的微博客很多,不少微博客都提供Open API,然而,很多微博提供的API和Twitter的API有一些或多或少的差别,调用格式上并不完全相同.   我建议所有提供API的微博客系统,都将各自的API统一为Twitter的API调用格式,例如目前较有影响的开源微博系统StatusNet(Laconica)的API格式就完全兼容Twitter,这种统一API对于开发者和用户都有很大的好处.