关于Heroku的慢速postgres查询不会被机架超时中断

sor*_*ens 7 postgresql rack heroku ruby-on-rails-3

我没有太多运气通过谷歌找到信息,也许这里有人有类似的问题.

我们有一个使用Postgres DB在Heroku上运行的rails应用程序.我们有一个特别慢的查询(是的,我们正在努力修复查询),但在调试这个问题的过程中,我发现我们的机架超时gem并没有在15秒内终止请求.我通过插入睡眠(50)进行了侧面测试,果然,在这种情况下,机架超时工作正常.

这是我们日志的编辑副本,显示机架时间(时间到了!)在几分钟后发生,我们仍然在30秒后看到H12请求超时.

    2011-12-14T21:15:16+00:00 app[web.2]: Started GET "/search?utf8=%E2%9C%93&terms=foo" for 173.164.186.205 at Wed Dec 14 13:15:16 -0800 2011
    2011-12-14T21:15:16+00:00 app[web.2]: search query elapsed time => [0.000365018844604492]
    2011-12-14T21:15:46+00:00 heroku[router]: Error H12 (Request timeout) -> GET /search dyno=web.2 queue= wait= service=30000ms status=503 bytes=0
    2011-12-14T21:18:47+00:00 app[postgres]: [6-1] [removed] [COBALT] LOG:  duration: 211241.725 ms  statement: SELECT  [truncated]
    2011-12-14T21:18:47+00:00 app[web.2]: 
    2011-12-14T21:18:47+00:00 app[web.2]: ActionView::Template::Error (Timeout::Error: time's up!: SELECT  [truncated]):
Run Code Online (Sandbox Code Playgroud)

有关实施机架超时的原因和方法的任何见解?

Nei*_*ton 4

是的,这里发生的事情就是我所说的僵尸测功机。位于 Dyno 上方的路由网格中发生 30 秒超时。理论上,您的 dyno 可以运行数小时,但用户将在 30 秒后直接从路由网格看到错误。

所以。发生的事情是这样的:

  1. 您的请求是在21:15:16
  2. 21:15:46路由网格返回错误,但你的测功机仍在处理
  3. 21:18:47您的要求完成。

至于 Rack::Timeout 和您长时间运行的查询发生的情况,可能取决于您使用的 pg gem,因为 Rack::Timeout 依赖于线程才能正常运行。这解释了为什么数据库返回时会出现超时。

有关僵尸动力的更多信息:http://neilmiddleton.com/avoiding-zombie-dynos-with-heroku/