【问题标题】:How to prevent Rails controller from hanging when making a web service call进行 Web 服务调用时如何防止 Rails 控制器挂起
【发布时间】:2016-11-19 01:23:11
【问题描述】:

我有一个 Rails 控制器,当用户加载特定页面时我会调用它。控制器调用第 3 方 Web 服务。但是,当 Web 服务关闭时,我的 Rails 控制器就会挂起。我无法导航到另一个页面、注销或刷新页面...所有这些任务都等待 Web 服务调用完成后再执行。如果 Web 服务调用从未完成,我必须重新启动我的 Rails 应用程序才能使其再次运行。

是否有防止这种情况发生的标准方法?我正在使用Faraday gem 进行网络服务调用。我想我可以在进行 Web 服务调用时设置一个超时值。但是,理想情况下,我希望导航到另一个页面的任何用户操作立即停止此 Web 服务调用。这可能吗?

【问题讨论】:

  • 您使用的机架实现服务器是什么?
  • @AmirRaminfar 我不确定我使用的是哪个 Rack 实现。你碰巧知道如何检查这个吗?
  • 如果您不知道,那么您可能正在使用 Webrick,它是 Rails 中的默认服务器。你不应该在生产中使用它。

标签: ruby-on-rails web-services faraday


【解决方案1】:

我相信这种情况正在发生,因为您可能正在使用一次只能处理一个请求的 Rack Web 实现。独角兽就像是事件驱动的那样。非常像节点。你应该考虑先用超时来解决这个问题。因此,如果您使用的是法拉第,您可以执行req.options.timeout = 5 之类的操作来设置超时。

那我推荐使用彪马。如果这不是一个选项,您应该调整您的服务器设置以允许一次多个连接。对于独角兽,我相信是worker_processes

【讨论】:

  • 值得注意的是,使用多线程/多进程服务器不会阻止控制器的动作挂起。只是其他工作人员将在那里处理与挂起的请求并行的其他请求。因此,所有工作人员在访问该操作时可能都会挂起。
  • 是的,这很好。还值得指出的是,根据负载,有多少线程可用并不重要。在某些时候,系统会降低性能。
  • 感谢 AmirRaminfar 和 @NicNilov 的快速回复!根据您所说,看起来为 Faraday 设置超时值并使用不同的 Rack 实现会使用户体验更好。谢谢你的想法!
  • 这就是人们迁移到 SPA 和编写 API 的原因。
猜你喜欢
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多