ruby-on-rails - 服务器在等待外部 api 响应时挂起所有请求

标签 ruby-on-rails ruby-on-rails-3 api request

我正在使用 discogs-wrapper gem 访问一些音乐信息,但我注意到在 api 请求期间服务器仍然静止,没有提供其他请求,其行为类似于调试器功能。我相信当我调用函数 Discogs::Artist.find_by_name name 时,实际的请求是在 gem 的以下部分触发的。

Net::HTTP.new(uri.host).start do |http|
  http.request(request)
end

在两个不同的浏览器(chrome 和 firefox)中跟踪两个请求的日志,我首先运行对艺术家“pink floyd”的搜索,然后在另一个浏览器中刷新根页面,最后一个简单的请求通常需要几毫秒,在 api 请求期间,只要请求持续,就需要花费时间。

Started GET "/artists/show?utf8=%E2%9C%93&artist_name=pink+floyd&commit=search" for 127.0.0.1 at 2012-01-21 18:03:52 +0000
Processing by ArtistsController#show as HTML
  Parameters: {"utf8"=>"✓", "artist_name"=>"pink floyd", "commit"=>"search"}
get_artist(pink floyd)
get_artist(pink floyd) - ended in 26394ms
  Rendered artists/_search_form.html.haml (4.3ms)
  Rendered discogs/artist/releases/_release.html.haml (606.5ms)
  Rendered artists/show.html.haml within layouts/application (1876.4ms)
Completed 200 OK in 28303ms (Views: 1907.8ms | ActiveRecord: 0.0ms)


Started GET "/" for 127.0.0.1 at 2012-01-21 18:04:20 +0000
Processing by ApplicationController#show as HTML
  Rendered artists/_search_form.html.haml (4.5ms)
  Rendered application/show.html.haml within layouts/application (6.5ms)
Completed 200 OK in 23ms (Views: 22.0ms | ActiveRecord: 0.0ms)

如何避免服务器因可能需要 30 秒以上的响应而无用地挂起? - 谢谢

最佳答案

您不想在请求/响应周期中执行任何可能像这样挂起的操作。理想情况下,Rails 应用程序中的所有操作都应尽快返回。

此问题的常见解决方案是将长时间运行的代码移至单独的后台作业进程。我不会尝试在单个 Rails 进程中 fork 或运行多个线程之类的事情。

我目前推荐的两种流行的后台处理解决方案是:

存在其他解决方案后台作业解决方案,但在我看来,这是两个最受欢迎的解决方案。

为了向用户反馈后台作业已完成,我想到了几个选项。

  • 使用 AJAX 轮询服务器以查看作业何时完成。对于 resque,有许多插件可以帮助完成此任务:https://github.com/quirkey/resque-statushttps://github.com/idris/resque-progress例如。我认为如果工作能够相对较快地完成的话,这是简单且合适的。另外,我不会太频繁地进行 ajax 调用。这取决于您的服务器响应时间和负载,但我不会比一两秒更频繁地执行此操作。如果您的服务器速度缓慢或负载过重,此轮询会使情况变得更糟。

  • 使用推送技术。我找到了Juggernaut super 容易使用。当作业完成后,将消息推送给客户端。然而,支持这一点的基础设施要复杂得多。但它消除了 Rails 服务器的轮询负载,并且推送技术可用于实现各种其他很酷的东西:)

关于ruby-on-rails - 服务器在等待外部 api 响应时挂起所有请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8955422/

相关文章:

SQL 菜鸟需要帮助编写涉及连接甚至相交的 Rails 查询

ruby-on-rails - 错误 : haml syntax error, 意外的 keyword_ensure,期待 $end

ruby-on-rails-3 - PgHero Rails - 列 "pid"不存在

azure - 转发 SMTP 地址可用于 ms-graph 吗?

java - 如何将 win32com.dll 包含到 jar 文件中?

python hug api返回自定义http代码

ruby-on-rails - 如何摆脱 Rails 中的周围引号?

ruby-on-rails - rails loggers 调试日志

ruby-on-rails - 将 twitter bootstrap 与 rails assets pipeline 和 less 一起使用

sql - Rails:SQLite3::CantOpenException:无法打开数据库文件