2

实现以下速率限制用例的最佳机制是什么。可以使用像令牌桶这样的通用算法,但我希望实现在 memcached 的上下文中。感谢您对此的帮助。

  • 一天只允许来自客户 ABC 的 100 个电话。
  • 一个小时内只允许客户 ABC 进行 50 次 API 调用。
  • 在一小时内只允许客户 ABC 对任何用户 ID 进行 5 次 API 调用。
4

2 回答 2

0

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

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

另一种选择是cacheismo。它是一个类似于 memcached 的缓存,支持 memcached 协议,它提供“缓存中”脚本。您可以实现自己的“ratelimiting”对象,而不是创建这么多的键,它将为您完成所有这些簿记。有关速率限制的示例实现,请参见http://chakpak.blogspot.in/2011/09/rate-limitingquota-with-cacheismo.html。你可以从这里得到它。https://github.com/iamrohit/cacheismo

于 2012-02-28T20:21:22.147 回答
0

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

您可以减慢处理他们的请求的速度,但这对于每秒几个的速度更有用。例如,客户 ABC 被限制为每秒或每分钟 100 个。对于您所说的非常低的费率,客户端会超时并认为服务器已死。

于 2011-12-25T09:05:03.780 回答