限制某种行为在某个单位时间内最多执行 N 次,怎么做比较好?

2018-08-19 17:36:24 +08:00
 d18

这里行为的主体有两种,一是单个主体,比如一个接口,限制其每单位时间内调用次数。二是有多个独立的主体,比如不同用户,限制用户每单位时间内执行某个操作的次数。
对于前者,有诸如 token-bucket 之类的算法。
对于后者,怎么实现比较好呢?

1853 次点击
所在节点    问与答
5 条回复
gamexg
2018-08-19 17:51:36 +08:00
kv 数据库,
key: 接口名称_分钟_用户 id
value: 调用次数
d18
2018-08-19 18:02:19 +08:00
@gamexg 再设置过期时间?
p2pCoder
2018-08-19 18:06:49 +08:00
用 redis 做限流就可以了
如果是 spring cloud,用 zuul 写个 filter 可以全局管理
dubbo 可以设置个限流的 filter,阿里最近开源了一个也可以
针对特定用户的操作也差不多,多一个 uid 就行
gamexg
2018-08-19 19:01:14 +08:00
@d18 key 自带时间,例如频率限制是每分钟 xx 次,那么 key 就带上 unix 时间戳 /60,读取时也带着这个这个。
scnace
2018-08-19 19:04:14 +08:00
关键字 ratelimit

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

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

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

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

© 2021 V2EX