【发布时间】:2013-10-19 15:35:59
【问题描述】:
我有一个在 WebRick 下运行的 Rails 应用程序。
据我所知,它作为单个实例运行,因此一次只能处理一个请求(应用程序方法调用)。因此,如果应用程序无法在新请求到达之前处理每个请求(离题:??或者它是网络服务器 [例如 webrick,nginx] 吗??),那么多个请求将排队。默认情况下与 Phusion Passenger 一样吗(我的应用一次只能处理一个请求,还是可以配置?)
我有两个类似的用例:
其中三个 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
.
其中三个 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" 聚合相同的请求并只对它们进行一次回复(当它们排队时)或者它是我的应用程序中的错误/一些问题?如果在这种情况下 rails 真的是 "smart" and "awared" - 我可以如何以及在哪里配置行为?
更新:
sidekiq 会导致这种情况吗?
【问题讨论】:
标签: ruby-on-rails ajax nginx webserver passenger