【问题标题】:Return many responses from a single ajax method in Rails从 Rails 中的单个 ajax 方法返回许多响应
【发布时间】:2013-03-28 21:44:27
【问题描述】:

我必须在 Rails 应用程序中发出 ajax 请求。这个 ajax 请求必须向一些服务器发出许多其他 http 请求。可能有很多(请求)

def ajax_request
  # request to the server1....
  # request to the server2....
  # request to the server3....
  # request to the server4....
  respond_to {|format| format.js }
end

当然,问题是它可能需要很长时间。请注意,每个请求都会返回一个独立数据的一部分,该部分可以显示在页面上,并且不依赖于其他请求。

我想做的是像这样返回部分数据

def ajax_request
  # request to the server1....
  respond_to {|format| format.js }

  # request to the server2....
  respond_to {|format| format.js }


  # request to the server3....
  respond_to {|format| format.js }


  # request to the server4....
  respond_to {|format| format.js }
end

我知道这行不通,但我正在寻找可以按照我提到的方式工作的代码。你会推荐我什么?

另一种选择是发送许多 ajax 请求

def ajax_request1
  # request to the server1....
  respond_to {|format| format.js }
end

def ajax_request2
  # request to the server2....
  respond_to {|format| format.js }
end

def ajax_request3
  # request to the server3....
  respond_to {|format| format.js }
end

但这可能会损害我的服务器的性能,不是吗?

你的想法?

【问题讨论】:

    标签: ruby-on-rails ruby ajax


    【解决方案1】:

    3 个快速响应优于 1 个长响应。 这也是分页的原因之一。

    每个请求只能有一个响应。 Rails 4 确实支持服务器发送事件,这会稍微改变这一点,但可能不是你想要的。

    实际上最终是一种平衡,如果您有大量请求而不是 1 个,那会很糟糕,但如果您将 1 个请求分成 2 个或 3 个,那么这很好,并且实际上可能会执行得更好。

    在大量请求的情况下,您只需将数据存储在 ivars 中,而不是有多个响应,然后将其传递给您的视图进行处理。

    如果您不在这里执行阻塞 I/O,那么您也可以将它们分解为单独的线程以缩短响应时间……如果您正在执行阻塞 I/O,并且预计会有很多此类请求那么最好考虑使用执行真正线程(JRuby 或 Rubinius)而不是 MRI 的 Ruby 实现。

    【讨论】:

    • 对所有数据发出一次请求几乎比对相同数据发出三个单独请求要好。除非您确实需要所有数据,否则这是不正确的。如果你得到了所有但只需要三分之一,那么你就是在浪费时间。不是非黑即白,但对于小请求,开销(网络、会话处理、参数解析、资源加载)往往会超过实际的具体请求处理时间。在带宽不错但延迟非常高的移动设备上尤其如此;在那里获得尽可能多的每个请求。
    • 视情况而定。如果用户依赖于该信息,那么 3 个短请求比 1 个长请求更好。说到性能,不仅仅是对服务器的影响,还有用户感知到的性能。由于其他位仍在处理中而对用户隐瞒信息通常不是好的用户体验。
    • 3 fast responses is better than 1 long one. 可能远远超过 3 个。
    【解决方案2】:

    这是一个使用缓存服务器和后台处理工作者的想法。例如,我们假设 Redis 用于缓存,Resque 用于后台处理,但您也可以使用 memcached 和 backburner (beanstalkd) 或其他任何服务于该功能的东西。

    当初始请求进来时,为请求创建一个唯一的 ID,可能是一个 GUID,并将其作为 JSON 响应返回给客户端。使用 GUID 作为缓存键(可能有一些过期时间)来保存结果,并为您需要从中请求数据的每台服务器创建一个后台任务。这些后台任务应包括任何请求参数以及缓存键的 GUID。

    您的 resque 工作人员可以从队列中拉出这些任务,运行请求,并将响应作为 JSON 放入 redis/memcached 缓存存储中。如果你有足够的工人,它们都可以并行,如果没有,它们最终都会完成,先进先出。同时,初始客户端可以使用长轮询每隔 1-2 秒请求一次新结果。它可能找不到任何结果、1 个新结果或多个。只需要跟踪已经看到哪些结果,以及何时获得所有结果。这样,用户将看到逐渐返回的更多信息,您甚至可以显示百分比或“4 / 20 完成”类型的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      相关资源
      最近更新 更多