我正在寻找最有效的方式来实施(或使用已经设置好的)速率限制器,以保护我的所有其余用户界面。我所看到的保护是每用户限制器的每秒呼叫次数"
我在网上看了一下,结果是使用了#34; Redis"或番石榴RateLimiter。
说实话,我从来没有使用过Redis,我真的不熟悉它。但通过查看其文档,似乎它具有非常强大的速率限制系统。
我还看了一眼Guava的RateLimiter。它看起来更容易使用(不需要安装redis等......)
所以我想在我的案例中提出一些建议""最好的解决方案?使用Redis"太多"?
你们有没有尝试过RateLimter?这是一个好的解决方案吗?它是否可扩展?
PS:如果您认为有更好的选择,我也会对上述其他解决方案持开放态度。
谢谢!
答案 0 :(得分:2)
Guava的RateLimiter会阻塞当前线程,因此如果针对受限制的服务发生异步调用,则会阻塞大量线程,并可能导致空闲线程耗尽。
也许基于Spring的库Kite可以满足您的需求。在主体达到某个时间段内请求数量的可配置限制后,风筝的“限速限制”拒绝请求。速率限制器使用Spring Security来确定所涉及的主体。
但是Kite仍然是单JVM方法。如果确实需要群集感知方法,Redis是一种可行的方法。
答案 1 :(得分:1)
如果您试图限制对基于Spring的REST api的访问,则应使用token-bucket algorithm。
有一个bucket4j-spring-boot-starter项目,该项目使用bucket4j库来限制对REST api的访问。您可以通过应用程序属性文件进行配置。 limit the access based on IP address or username有一个选项。
如果您使用的是Netflix Zuul,则可以使用Spring Cloud Zuul RateLimit,它使用不同的存储选项:Consul,Redis,Spring Data和Bucket4j。
答案 2 :(得分:0)
没有硬性规则,完全取决于您的具体情况。如果"我从未使用过Redis",我会推荐番石榴RateLimiter。相比redis,一个全新的nosql系统,番石榴RateLimiter更容易上手。通过添加几行代码,您可以以可配置的速率分配许可。剩下要做的就是调整它以满足您的需求,例如为每个用户提供速率限制。