请教, Java 怎么控制 API 调用的频率

2019 年 5 月 29 日
 liaojl
服务端需要调用第三方 API,但是第三方 API 有调用频率限制,多次超出调用频率会被拉黑。目前用线程池来调 API,怎么才能控制服务器端每分钟调用次数不超过指定数量,比如每分钟不超过 500 次。
9766 次点击
所在节点    Java
36 条回复
micean
2019 年 5 月 29 日
guava 有 ratelimiter
itechify
2019 年 5 月 29 日
用变量来记录当前时间分钟对应的调用次数可以否?到下一分钟,重置为 0,这分钟内每次调用增加 1,到 500 提示失败
itechify
2019 年 5 月 29 日
我渣渣哈哈~没做过这个东西,胡乱猜想的
liaojl
2019 年 5 月 29 日
@micean 好东西,正是我想要的
liaojl
2019 年 5 月 29 日
@oneisall8955 我也这么想过,但是后来一想,如果负责置 0 的那个线程阻塞或者发生什么意外,那就 gg 了
runtu2019
2019 年 5 月 29 日
@liaojl 同时放个时间戳,变量只做自增作用,同时校验时间戳和数量,单个线程崩了应该没事
liaojl
2019 年 5 月 29 日
@runtu2019 好办法
kingwrcy
2019 年 5 月 29 日
单机 guava,分布式 redis
securityCoding
2019 年 5 月 29 日
1. guava 单机限流
2.阿里开源的 Sentine
l8g
2019 年 5 月 29 日
单机可以看下 Guava 的 RateLimiter
分布式场景下用 Redis 的 zset 做个简单的限流也可以
palmers
2019 年 5 月 29 日
liaojl
2019 年 5 月 29 日
@securityCoding
@l8g
@palmers
谢谢各位!
dawncold
2019 年 5 月 29 日
一个好的 API 设计会告诉你当前时间窗口还剩多少次调用,遵照执行就好
gz911122
2019 年 5 月 29 日
rxjava 被压
CoderGeek
2019 年 5 月 30 日
简单的限流就可以实现 楼上都说了
xuanbg
2019 年 5 月 30 日
redis 里面搞一个过期时间为 1 分钟的 key 作为计数器,读到计数器到达 500 了,就报调用失败或者扔到队列里面去等下一分钟再调用。队列可以满足削峰的需求,但不能满足你每分钟平均次数超过 500 的需求。如果平均每分钟超过 500 的话,只能报错了。
jorneyr
2019 年 5 月 30 日
lihongjie0209
2019 年 5 月 30 日
老老实实写日志到 redis 或者是数据库中, 调用之前先查询一下日志.

基于 guava 这种内存型的, 服务器重启就 GG 了.
aino
2019 年 5 月 30 日
俺用的 RateLimiter
luozic
2019 年 5 月 30 日
kong/其他平台的网关

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/568892

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX