Servletfilter:非常简单的限速filter,允许突发

我想添加一个非常简单的filter来执行每IP速率限制,但仍然允许突发,有点像iptables允许做的。

我不想安装整个厨房水槽:我只需要一个实现该function的Filter类。

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

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

仅仅是为了比较,这里是如何使用iptables配置类似的速率限制与突发(这只是一个例子,显示我在说什么,即使在我的情况下它不是关于设置速率限制+ TCP TCP数据包突发):

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

Java级别:

  • 找到一个基于Esper的速率限制器,您可以根据突发需求构建自己的查询。
  • Jetty有一个内置的servlet filter
  • 带有内置块的 Java库,用于创建自己的机制
  • 骆驼有一个节流机构

但我认为在网络服务器级别实施更容易

  • Nginx的
  • Apache Httpd

或者使用专用服务器插件

  • IBM WebSphere DataPower

你也可以看看Guava RateLimiter – 它为更复杂的限速器提供了一个很好的起点。