针对给定场景的速率限制算法建议

时间:2011-12-25 07:00:51

标签: java algorithm memcached rate-limiting ratelimit

实施以下限速用例的最佳机制是什么?可以使用像Token Bucket这样的常规算法,但我希望实现在memcached的上下文中。感谢你的帮助。

  • 一天只允许客户ABC拨打100个电话。
  • 一小时内只允许50个API呼叫客户ABC。
  • 一小时内只允许5个API呼叫客户ABC用于任何用户ID。

2 个答案:

答案 0 :(得分:0)

达到此限制时,您希望发生什么?您可以阻止服务或重定向到明天回来的页面,但这非常难看。

您可以降低处理请求的速度,但这对于每秒几个的速率更有用。例如客户ABC限制为每秒或每分钟100。对于你所谈论的非常低的费率,客户会超时并认为服务器已经死了。

答案 1 :(得分:0)

如果我理解这一点,每个API请求都附带一个userID和customer。每个客户可以拥有多个用户ID。您希望在客户和用户ID级别对速率进行限制。

您需要使用多个键ABC_day,ABC_hour,ABC_userID1_hour,ABC_userID2_hour等来计算这些活动发生的次数。这种方法的问题是何时重置这些计数器。由于memcached仅支持数值增量运算符,因此我们需要在密钥本身中对此信息进行编码。我们可以使用ABC_2012_02_28作为日费率限制的关键。在您的代码中,只需使用当前日期创建密钥并增加它。当一天更改时,您的代码将查找不存在的ABC_2012_02_29,并为您提供创建新密钥的机会。

替代方案是cacheismo。它是一个像memcached这样的缓存,支持memcached协议,它提供“缓存”脚本。您可以实现自己的“限速”对象,而不是创建这么多的密钥,这将为您完成所有这些簿记。 有关速率限制的示例实现,请参阅http://chakpak.blogspot.in/2011/09/rate-limitingquota-with-cacheismo.html。你可以从这里得到它。 https://github.com/iamrohit/cacheismo