从Rails中的单个ajax方法返回许多响应

时间:2013-03-28 11:51:01

标签: ruby-on-rails ruby ajax

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

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

你的想法?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

如果您没有在此处阻止I / O,那么您也可以将它们分解为单独的线程以改善响应时间......如果您正在阻止I / O,并期望大量这些类型的请求那么使用一个执行真正线程(JRuby或Rubinius)而不是MRI的Ruby实现可能是一个好主意。

答案 1 :(得分:1)

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

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

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