请求Grape API for rails阻止其他请求

时间:2015-06-04 20:33:02

标签: ruby-on-rails-4 grape grape-api

对于我的rails应用程序,我使用gem Grape设置了一个API。我添加了一个测试帖法,代码会在10秒内休眠并返回{'status'=>'success'}。一切正常,除了API调用似乎阻止发送到服务器的所有其他请求。在此睡眠10秒api完成之前,不会执行任何其他请求。来自前端接口的任何GET请求都将被延迟。如果我模拟两个api调用,则第二个调用需要20秒(等待第一个调用完成后10秒)才能完成。请就此提出建议。

api.rb文件如下所示:

module ProjectName
  module MyErrorFormatter
    def self.call message, backtrace, options, env
      { "status" => "Fail", "error_message" => message }.to_json
    end
  end

  class API < Grape::API

    format :json
    default_format :json
    prefix 'api'
    cascade false
    error_formatter :json, MyErrorFormatter
    helpers APIHelpers

    before do 
      authenticate!
    end

    post do
      if params[:action].present?
        p_url = format_url(params)
        redirect "/api/#{params[:action]}?key=#{params[:key]}#{p_url}"
      end
    end

    post 'test' do
      sleep(10)
      {'status'=>'success'}
    end
  end
end

我正在使用Rails 4.2.0

1 个答案:

答案 0 :(得分:2)

这意味着您的请求不会同时并行处理。 在Rails 4中启用了threadsafe,这可能与此有关。 Threadsafe可能会锁定您的操作,因此您的下一个请求无法获取访问权限。但是,您可以明确告诉服务器处理同时请求。在所有配置/环境文件中添加此行将有所帮助。

config.allow_concurrency = true

此外,您还需要一台能够像puma一样处理并发性的服务器。

有关此herehere的更多信息。