2015-06-04 12 views
4

Для моего приложения rails я создал API с драгоценным камнем Grape. Я добавляю метод тестового сообщения, что код спящий 10 секунд и возвращает {'status' => 'success'}. Все работает, за исключением того, что вызов API блокирует все другие запросы, отправленные на сервер. Любые другие запросы не будут выполняться до тех пор, пока этот сон не завершится 10 секунд. Любой запрос GET с интерфейсного интерфейса будет задерживаться. И если я имитирую два вызова api, то требуется второй вызов 20 секунд (10 секунд для ожидания завершения первого). Просьба сообщить об этом.Запрос API Grape для рельсов блокирует другие запросы

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

ответ

2

Это означает, что ваши запросы не обрабатываются одновременно параллельно. threadafe включен в Rails 4, и это может иметь какое-то отношение к этому. Threadsafe может блокировать ваше действие, поэтому ваш следующий запрос не может получить доступ. Однако вы можете явно указать серверу для обработки одновременного запроса. Добавление этой строки во все ваши файлы конфигурации/окружения поможет.

config.allow_concurrency = true

Кроме того, вам нужен сервер, который может обрабатывать параллелизм как пума.

Подробнее об этом here и here.