如何在Rails 3.1中渲染后执行某些任务

jas*_*ber 12 rendering fork ruby-on-rails ruby-on-rails-3.1

我正在使用Impressionist来记录页面展示次数.数据库写入只需要大约50ms,但我真的更喜欢在页面呈现并发送到客户端之后执行此操作.

我已经研究过通过Spawn分叉,但它建立了一个新的数据库连接,这对于这么小的工作来说似乎有些过分.延迟工作和其他后台处理库似乎是一个重大的过度杀伤.写入数据库只是为了推迟写入数据库......不是胜利.

我希望我可以:

def show
  render
  impressionist(@article)
end
Run Code Online (Sandbox Code Playgroud)

...并且让印象派使用相同的数据库连接和所有相同的请求数据来执行其操作,就在操作已经返回到客户端之后.但当然,这不是渲染方法的工作原理.

有解决方案吗 在Heroku Cedar上运行Rails 3.1和Ruby 1.9.2.

dmz*_*zza 6

产生一个新线程.Heroku将允许每个dyno最多15个线程.

def show
  render
  Thread.new do
    impressionist(@article)
  end
end
Run Code Online (Sandbox Code Playgroud)


ADA*_*DAM 0

如何记录到像 mongodb 这样更快的东西,或者您可以考虑在 redis 中存储哈希(超快),并每小时左右运行一个批处理作业以将它们存储在 postgres 数据库中。使用这两个选项,您将不得不破解印象派,或者推出您自己的解决方案,正如您对后台解决方案(delayed_job、resque 等)所建议的那样,根据您的项目的大小,该解决方案可能会过度杀伤力。