4

我将使用 Rack Cache(与 Memcache)来缓存来自我使用 Rails 构建的 API 的响应。此外,我需要为 API 实现命中计数。有什么建议可以解决这个问题吗?我猜它需要用 Rack 处理,但不知道从哪里开始。谢谢!

4

2 回答 2

5

我建议在中间件堆栈的顶部添加一个 Rack 中间件,这会增加请求路径的计数器。

例如,要使用 Redis 执行此操作:

# lib/request_counter.rb
class RequestCounter
  def self.redis
    @redis ||= Redis.new(host: ENV["REDIS_HOST"], port: ENV["REDIS_PORT"])
  end

  def initialize(app)
    @app = app
  end

  def call(env)
    request = Rack::Request.new(env)
    self.class.redis.incr "request_counter:#{request.fullpath}"
    @app.call(env)
  end
end

# config/application.rb (in the Rails::Application subclass)
require "request_counter"
config.middleware.insert(0, RequestCounter)

这意味着每个请求/path都会增加 Redis 键request_counter:/path

于 2013-09-16T02:50:14.217 回答
1

根据您的生产设置,您可能可以通过以下方式之一执行此操作

  • 使用您自己的脚本或使用 splunk 解析 nginx 日志(示例
  • 编写自己的 nginx 模块来进行计数
  • 在 Rack::Cache 之前附加您自己的 Rack 中间件以进行计数(指南
于 2013-09-16T00:17:19.750 回答