WebRick で実行される Rails アプリがあります。
私が今理解したように、それは単一のインスタンスとして実行されるため、一度に 1 つの要求 (アプリケーション メソッド呼び出し) しか処理できません。そのため、アプリが新しいリクエストが到着する前に各リクエストを処理できない場合、複数のリクエストがキューに入れられます (トピック外: ?? または Web サーバー [webrick、nginx] が処理しますか??)。デフォルトでPhusion Passengerと同じですか(私のアプリは一度に1つのリクエストしか処理できないのですか、それとも設定可能ですか?)
同様のユースケースが 2 つあります。
3 つの AJAX リクエストが同じデータで送信される場合 (たとえば、同じリクエスト)
$('#cancel_search').click (e) ->
console.log("DEBUG: send ajax_cancel_search")
$.ajax
type: 'get'
url: "/app/cancel"
data: {attempt: 1}
dataType: "json"
error: (error) ->
console.log('DEBUG: ERROR: [app/cancel ' + document.cancel_cnt + '] returned an error!' + JSON.stringify(error)) # not really reliable with document.cancel_cnt, but this case doesn't matter
# ...
return
success: (data) ->
console.log('DEBUG: OK: [app/cancel ' + data.current_attempt + '] succeeded. Data: ' + JSON.stringify(data))
# ...
return
return false
.
そして、3つのAJAXリクエストが異なるデータで送信されるもの(たとえば、異なるリクエスト)
$('#cancel_search').click (e) ->
document.cancel_cnt++ // this variable init to 0 at the beginning
console.log("DEBUG: send ajax_cancel_search")
$.ajax
type: 'get'
url: "/app/cancel"
data: {attempt: document.cancel_cnt}
dataType: "json"
error: (error) ->
console.log('DEBUG: ERROR: [app/cancel ' + document.cancel_cnt + '] returned an error!' + JSON.stringify(error)) # not really reliable with document.cancel_cnt, but this case doesn't matter
# ...
return
success: (data) ->
console.log('DEBUG: OK: [app/cancel ' + data.current_attempt + '] succeeded. Data: ' + JSON.stringify(data))
# ...
return
return false
対応する railsSearchController
のcancel
メソッドは次のようになります。
def cancel
attempt = params[:attempt]
puts ("INFO: [cancel] attempt #{attempt} requested")
respond_to do |format|
format.json {
puts ("INFO: OK: [cancel] attempt #{attempt} succeeded")
render :layout => false, :text => JSON.pretty_generate({current_attempt: attempt})
}
end
end
TLDR:
問題は、Rails が"smart" and "awared"
同じリクエストを集約して (キューに入れられたときに) 1 回だけ応答するようになっているのか、それともアプリのバグや問題なのかということです。レールが本当に"smart" and "awared"
この場合である場合、どのように、どこで動作を設定できますか?
アップデート:
sidekiq
これを引き起こすことができますか?