我正在为我的Rails应用创建一个API,我希望跟踪用户调用特定API方法的次数,并限制他们说每天1000次请求。我期待多个用户的请求量非常高。
您是否有关于如何跟踪每个用户的内容的建议?我想避免不得不反复写入数据库并处理锁。
我可以做延迟写入(API限制不一定非常精确),但有没有一种标准方法可以做到这一点?
答案 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管理(发布密钥,强制配额等)。我们还提供结算支持,以便您可以设置每次通话价格等。