【问题标题】:Why getting only single response for multiple queued requests in Rails?为什么在 Rails 中只获得多个排队请求的单个响应?
【发布时间】: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

对应的railsSearchControllercancel方法如下:

  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


    【解决方案1】:

    您只是表明您一次只提出一个请求。如果您向 Rails 发送 3 个请求,将会响应 3 次。它不会以任何方式聚合类似的请求。

    【讨论】:

    • 我表明我在收到 Rails 应用程序的任何响应之前发出 三个 请求。 at a time 我的意思是 in one step(请求-响应)
    • 我的意思是你的代码只显示一个请求。我不确定您如何从您显示的代码中一次收到三个请求。
    • 代码就是函数cancel(),我调用了三次次(看图表)。在函数中,我有 one ajax 调用。所以三乘一=三,不是吗?还请看图表,它们是案例的主要图片,它们显示了案例中的行为,代码仅显示了one调用背后的逻辑。
    • 你的问题的答案还是一样的。如果您发送 3 个请求,您将收到 3 个响应。
    【解决方案2】:

    您只进行了一次 AJAX 调用。当然,如果你把这个调用放在一个循环中,它会发送三个请求,你肯定会得到三个响应。

    【讨论】:

    • only one AJAX call 在哪里?我肯定depicted 3(三个)AJAX 调用(他们在图表上的名字是cancel(data1))。下面的代码只是 cancel() 的代码,但我显示我点击了 3(三)次。循环是什么意思?我问为什么不同数据的行为不同。那么如果你说我只做一个 AJAX 请求,为什么两个相似的代码会产生不同的行为(一个只发送一个 AJAX 请求(即使我看到它做了 3 个),另一个发送 3 个请求?)
    • 我不知道它是否有用。看到这个链接guides.rubyonrails.org/caching_with_rails.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多