【问题标题】:Save requests for a certain action保存特定操作的请求
【发布时间】:2013-09-09 11:07:23
【问题描述】:

我想在名为 Impression 的模型中保存有关对某个操作的请求的信息。

我认为将此信息保存在 after_filter 中对访问者的响应时间是有益的,例如:

after_filter :save_impression


private
    def save_impression
        Impression.create!(ip_address: request.remote_ip, controller_name: params[:controller], action_name: params[:action], referer: request.referer)
    end

这段代码可以优化还是我做对了?

【问题讨论】:

    标签: ruby-on-rails ruby visitor-statistic impressions


    【解决方案1】:

    一个好的解决方案通常涉及使用工作人员。任何对请求不是关键任务且涉及复杂计算的内容都可以延迟并稍后由后台作业运行。

    两种常见的worker实现是delayed_jobresque

    例如,使用 resque,您将在 app/jobs/impression_creation_job.rb 中有一个工作类,其中包含类似的内容:

     class ImpressionJob
      @queue = :impression
    
      def self.perform( attrs )
        Impression.create!( attrs )
      end
    end
    

    你可以像这样在你的控制器中调用它:

    after_filter :save_impression
    
    
    private
      def save_impression
        Resque.enqueue( ImpressionJob, ip_address: request.remote_ip, controller_name: params[:controller], action_name: params[:action], referer: request.referer)
      end
    

    这将确保快速处理请求部分(它只是在 redis 中加载数据),然后由后台进程处理(请参阅 resque 文档了解如何设置和启动工作线程)。

    请注意,这仅在两种情况下对您的情况有用:

    1. 您的应用始终处于高负载状态或需要特别好的响应时间
    2. 您在 Impression#before_create 或其他回调中进行大量计算

    如果不符合其中一个条件,那么只让您在控制器过滤器中创建印象可能更有效:访问数据库是有成本的,但当您在数据库中进行单次插入时,用户会感受到的成本并不高。

    【讨论】:

      【解决方案2】:

      这仍然会在渲染之前运行。要在渲染/重定向之后运行,您需要生成一个单独的线程。

      See this question

      【讨论】:

        猜你喜欢
        • 2021-07-22
        • 2023-04-08
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        • 2013-04-07
        • 2014-05-22
        相关资源
        最近更新 更多