0

我必须在 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

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

你的意见?

4

2 回答 2

1

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

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

它实际上最终是一个平衡,如果你有大量的请求而不是 1,那会很糟糕,但如果你将 1 个请求分成 2 个或 3 个,那很好,实际上可能会表现得更好。

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

如果您不在这里进行阻塞 I/O,那么您也可以将它们分成单独的线程以提高响应时间……如果您正在执行阻塞 I/O,并且期望有很多此类请求,那么它可能考虑使用执行真正线程(JRuby 或 Rubinius)而不是 MRI 的 Ruby 实现是一个好主意。

于 2013-03-28T12:02:56.550 回答
1

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

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

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

于 2013-03-28T13:44:27.097 回答