【问题标题】:Servlet filter: very simple rate-limiting filter allowing burstsServlet 过滤器:非常简单的限速过滤器,允许突发
【发布时间】:2012-04-25 00:41:55
【问题描述】:

我想添加一个非常简单的过滤器,对每个 IP 进行速率限制,但仍然允许突发,有点像 iptables 允许做的事情。

我不想安装整个厨房水槽:我只需要一个实现该功能的过滤器类。

什么是一个好的数据结构/算法,允许做一个简单的“限速但允许短突发”?

例如,如果用户每分钟尝试执行的 GET / POST 次数超过 'x',我想提供一个 HTTP 错误代码,但我仍然想让同一个用户“爆发”到 ' y'(其中 y > x),直到他达到爆裂帽。

只是为了比较,下面是如何使用 iptables 配置类似的 rate-limitation-with-a-burst(这只是一个示例,以说明我在说什么,即使在我的情况不是对 TCP SYN 数据包设置速率限制+突发):

iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 5

【问题讨论】:

  • 我对 Apache 的 svn 服务器的请求进行了一些分析,正是针对这个问题。我的结论是,如果所需的限制是 x reqs/min,那么每 n 分钟实施 nx 的限制,并根据您认为可接受的突发流量配置文件选择 n。我最终设置了每天的限制。

标签: java tomcat servlet-filters rate-limiting


【解决方案1】:

Java 级别:

  • 找到了一个基于 Esper 的速率限制器,您可以在其中构建自己的查询来满足您的突发需求。
  • Jetty 有一个内置的 servlet filter
  • 带有内置 blocks 的 Java 库,用于创建您自己的机制
  • Camel 有节流机构

但我认为在 webserver 级别实现更容易

或使用专用的服务器插件

【讨论】:

  • 如果HTTPS会话在Tomcat中终止,在nginx中实现限速并不容易。
【解决方案2】:

您还可以查看 Guava RateLimiter - 它为更复杂的速率限制器提供了一个很好的起点。

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 2015-07-31
    • 2011-04-03
    • 2015-09-12
    • 2013-04-06
    • 2020-06-11
    • 2012-06-24
    • 2012-02-17
    相关资源
    最近更新 更多