
1 micean 2019-05-29 20:23:56 +08:00 guava 有 ratelimiter |
2 itechify PRO 用变量来记录当前时间分钟对应的调用次数可以否?到下一分钟,重置为 0,这分钟内每次调用增加 1,到 500 提示失败 |
3 itechify PRO 我渣渣哈哈~没做过这个东西,胡乱猜想的 |
5 liaojl OP @oneisall8955 我也这么想过,但是后来一想,如果负责置 0 的那个线程阻塞或者发生什么意外,那就 gg 了 |
9 securityCoding 2019-05-29 21:20:55 +08:00 1. guava 单机限流 2.阿里开源的 Sentine |
10 l8g 2019-05-29 21:33:12 +08:00 单机可以看下 Guava 的 RateLimiter 分布式场景下用 Redis 的 zset 做个简单的限流也可以 |
11 palmers 2019-05-29 21:33:13 +08:00 |
12 liaojl OP |
13 dawncold 2019-05-29 23:11:09 +08:00 一个好的 API 设计会告诉你当前时间窗口还剩多少次调用,遵照执行就好 |
14 gz911122 2019-05-29 23:13:25 +08:00 rxjava 被压 |
15 CoderGeek 2019-05-30 01:31:51 +08:00 简单的限流就可以实现 楼上都说了 |
16 xuanbg 2019-05-30 03:28:02 +08:00 redis 里面搞一个过期时间为 1 分钟的 key 作为计数器,读到计数器到达 500 了,就报调用失败或者扔到队列里面去等下一分钟再调用。队列可以满足削峰的需求,但不能满足你每分钟平均次数超过 500 的需求。如果平均每分钟超过 500 的话,只能报错了。 |
17 jorneyr 2019-05-30 07:47:45 +08:00 一文搞懂 Nginx 限流,原来这么简单 https://www.toutiao.com/i6694571806835081742/,用这个就不用写代码了 |
18 lihongjie0209 2019-05-30 08:58:08 +08:00 老老实实写日志到 redis 或者是数据库中, 调用之前先查询一下日志. 基于 guava 这种内存型的, 服务器重启就 GG 了. |
19 aino 2019-05-30 09:15:46 +08:00 俺用的 RateLimiter |
20 luozic 2019-05-30 09:18:07 +08:00 via iPhone kong/其他平台的网关 |
21 liaojl OP @jorneyr 是限制我方调用第三方 API 的频率,不是限制客户端调我方 API 的频率,不过还是感谢哈,Nginx 还可以这么用 |
22 liaojl OP @lihongjie0209 哈哈,只是限制每分钟的调用频率,不限制历史总的调用次数的 |
23 lzxz1234 2019-05-30 10:31:58 +08:00 选定一个时间单位,记录这个时间段内所有请求发出去的时间,每次请求时查看最早的那个请求时间,大于时间单位通过并更新请求时间,否则等待或者返回 false,一个循环数组就可以搞定了,根据目标频率选一个合适的大小就可以 |
24 clarkyi 2019-05-30 11:41:23 +08:00 guava 这种不支持分布式吧?多台设备就 gg 了,redis+guava 考虑一下 |
25 lihongjie0209 2019-05-30 11:55:00 +08:00 |
26 cyhulk 2019-05-30 12:46:48 +08:00 @lihongjie0209 要看场景的,如果是考虑性能问题限制次数,重启了,重新 300 也无所谓,反正服务器重启过了,300 也压的住,直接内存,相对于 redis 调用的性能损耗,要划算的多 |
27 luozic 2019-05-30 12:53:07 +08:00 via iPhone 网关也能干出去调用的,代理一下就行。 |
28 temp178 2019-05-30 13:02:51 +08:00 via Android 单机的话简单的限流算法就可以 令牌桶算法之类的 |
29 vtoee 2019-05-30 13:10:55 +08:00 有点类似于调百度地图 API 坐标转换 |
30 lihongjie0209 2019-05-30 13:15:23 +08:00 @cyhulk 这个限制是第三方 API 的, 不是楼主的 |
31 EastLord 2019-05-30 13:17:39 +08:00 目测 阿里的 Sentine 满足楼主需求 |
32 zzzmode 2019-05-30 13:23:04 +08:00 kong 网关 |
33 opengps 2019-05-30 13:27:11 +08:00 如果是单机应用,服务器上装个安全狗之类的防护工具,可以对所有请求整体频率起效果。 如果只是某个接口调用,套了 cdn 则被忽视,不套上 cdn 的业务需要做个公共缓存统计,记录一个列表,每次请求顺便释放掉超时的缓存对象 |
34 opengps 2019-05-30 13:29:08 +08:00 如果是单机单接口,那么可以利用系统自带缓存,或者本机 memcached 缓存做个计数(取出结果非等于 1 则++,等于 null 则赋值 1 ),超时时间就设置 1 分钟 |
35 gaius 2019-05-30 14:24:41 +08:00 这问题我遇到过,1 时 0 分 1s 发了 500 个,2 时 0 分 2s 又发了 500,从 1s 到 2s 的这个时间窗口却是 1 小时发了 1000。 如果消费还有优先级的话,还再麻烦点。 |
36 gscoder 2019-05-30 19:52:38 +08:00 和限流是一样的方法:漏桶算法、令牌桶算法、滑动窗口算法。 |