跟踪API访问的最快方法

时间:2009-08-26 23:16:29

标签: ruby-on-rails

我正在为我的Rails应用创建一个API,我希望跟踪用户调用特定API方法的次数,并限制他们说每天1000次请求。我期待多个用户的请求量非常高。

您是否有关于如何跟踪每个用户的内容的建议?我想避免不得不反复写入数据库并处理锁。

我可以做延迟写入(API限制不一定非常精确),但有没有一种标准方法可以做到这一点?

4 个答案:

答案 0 :(得分:0)

这实际上取决于服务器数量,数据集,用户数量等。

一种方法是在服务器上的内存中维护配额数据结构,并在每次调用时更新它。如果您有多个服务器,则可以维护配额的内存缓存。显然,基于内存的实现无法在重新启动或重新启动后继续存在,因此需要某种序列化来支持它。

如果配额准确性至关重要,最好在数据库中执行此操作。你可以在一个文件中完成它,但是你遇到了你试图避免使用数据库的相同问题。

编辑: 您还可以执行混合方法 - 维护基于内存的用户| api |调用计数缓存,并定期将其写入数据库。

有关要求的更多信息将有助于削减选项..

答案 1 :(得分:0)

您可以尝试Apigee。看起来它“每小时免费发送10,000条消息”。

免责声明:我从未使用过Apigee。

答案 2 :(得分:0)

这是使用rails cache

执行此操作的方法
call_count_key = "api_calls_#{params[:api_key]}_#{Time.now.strftime('%Y-%m-%d-%Hh')}"
call_count = Rails.cache.read(call_count_key) || 0
call_count += 1
Rails.cache.write call_count_key, call_count

# here is our limit
raise "too many calls" if call_count > 100

这不是一个完美的解决方案,因为它不能正确处理并发性,如果你使用内存缓存(rails默认),那么这将是一个每个进程计数器

答案 3 :(得分:0)

如果您对托管解决方案没问题,请查看我的公司WebServius(http://www.webservius.com),它执行API管理(发布密钥,强制配额等)。我们还提供结算支持,以便您可以设置每次通话价格等。