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

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

基于 guava 这种内存型的, 服务器重启就 GG 了.
aino
2019-05-30 09:15:46 +08:00
俺用的 RateLimiter
luozic
2019-05-30 09:18:07 +08:00
kong/其他平台的网关

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

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

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

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

© 2021 V2EX