我正在使用Spring 3 + Spring MVC开发一个简单的REST API。身份验证将通过使用Spring Security的客户端令牌通过OAuth 2.0或基本身份验证完成。这仍在争论中。所有连接将通过SSL连接强制。如何在Spring中基于客户端令牌实现速率限制?
我一直在寻找有关如何实施速率限制的信息,但似乎并没有很多信息。实施需要分布,因为它可以在多个Web服务器上工作。
例如,如果有三台api服务器A,B,C和客户端每秒限制为5个请求,那么发出6个请求的客户端会发现请求C被拒绝并出现错误。
A recieves 3 requests \
B receives 2 requests | Executed in order, all requests from one client.
C receives 1 request /
它需要合作,开发基于包含在请求一个道理,作为一个客户端可以是代表了众多网友的提出请求,并且每个用户应该速率的限制,而不是服务器的IP地址。
设置将是HAProxy负载均衡器后面的多个(2-5)Web服务器。有一个Cassandra支持,并使用memcached。 Web服务器将在Jetty上运行。
一个潜在的解决方案可能是编写一个定制的Spring Security过滤器,该过滤器提取该令牌并检查在最近X秒内对它做了多少请求。这将允许我们为不同的客户做一些不同的费率限制。
有关如何完成的任何建议?有没有现有的解决方案,还是必须编写我自己的解决方案?我之前没有做过很多网站基础设施。
您正处于正确的轨道上,并且带有过滤器的想法。既然你已经在使用memcached,它应该很简单。 – sourcedelica 2012-04-17 03:45:30
它看起来像一个过滤器可能是要走的路。找到一篇有用的文章,介绍如何实现一个桶系统的时间间隔,这样你就可以检查最近X分钟/秒的使用情况 - > http://chris6f.com/rate-limiting-with-redis。它使用redis,但原理应该与memcache或cassandra类似。 – 2012-04-18 23:42:06