一个好的解决方案通常涉及使用工人。任何对请求来说不是关键任务并且涉及复杂计算的东西都可以延迟并稍后由后台作业运行。
两种常见的worker实现是delayed_job和resque。
例如,使用 resque,您将有一个工作类 in 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 文档)。
请注意,这仅在两种情况下对您的情况有用:
- 您的应用程序总是处于高负载状态或需要特别好的响应时间
- 您在
Impression#before_create
或其他回调中进行大计算
如果不符合其中一个条件,那么只让您在控制器过滤器中创建印象可能更有效:访问数据库是有成本的,但当您在数据库中进行单次插入时,用户会感受到的成本并不高。