Ruby Grape Reactor被阻止

时间:2013-03-11 16:32:42

标签: ruby blocked reactor grape

我正在使用Ruby Grape创建一个API,我面临以下问题。 当有新的GET请求时,会请求大量数据,这需要很长时间,同时Reactor被阻止,在请求完成之前不会处理任何新请求。 代码很简单:

class API < Grape::API
  resource :users do
    get do
      get_users()
    end
  end
end

get_users通过TCP连接到另一个系统,并获取大量数据转换为JSON。这是使用第三方gem完成的。 什么是处理这种情况的最佳选择?

2 个答案:

答案 0 :(得分:0)

我想到两个选择:

  1. 设置乘客/独角兽等,并配备足够的工作人员来处理并发请求。
  2. 如果这还不够:重新制作API逻辑,以便长时间操作可以分解为两个调用:第一个 - 保留请求,第二个 - 检查完成/检索结果。
  3. 此外,如果它合适 - 您可以缓存get_users()

    的结果

答案 1 :(得分:0)

您的应用程序执行长时间运行的阻止I / O操作。为了很好地处理这些类型的工作负载,您的系统需要支持高I / O并发性。

传统的单线程多进程系统(如Phusion Passenger开源和Unicorn)不适合这些类型的工作负载。他们可以处理的并发数量受进程数量的限制。这个问题记录在Unicorn的philosophy page,“在某些情况下更糟糕”部分,或最近关于tuning Phusion Passenger's concurrency的Phusion文章中。

虽然Thin理论上能够处理由于其I / O模型的高I / O并发性,但必须明确编写应用程序和框架以利用这一点。很少有框架可以做到这一点。 Rails和Sinatra都不支持事件I / O. Cramp支持它,还有另一个新的公平框架,我的名字已经忘记了。但似乎Grape不支持事件I / O.

解决方案是切换到支持多线程的应用程序服务器,它还能够支持高I / O并发性。一个这样的应用服务器是Phusion Passenger 4 Enterprise,它支持混合多线程/多进程模型。多线程是并发性的,而多进程是为了稳定性和利用多个CPU核心的能力。 Phusion博客describes optimal concurrency settings for different workloads.