2010-11-03 106 views
7

我正在构建一个Ruby on Rails应用程序,它可以访问6-7个API,根据用户的输入从他们那里获取信息,比较和显示结果给用户(信息不保存在数据库中)。我将使用Heroku来部署应用程序。我希望这些HTTP请求能够并行访问API,因此回答时间会更好,而不是顺序执行。你认为在Heroku中达到这个目标的最好方法是什么?如何在Heroku中执行并行HTTP请求?

非常感谢您的任何建议!

回答

6

如果你想真正做服务器端请求(TFE的JavaScript的解决方案是一个好主意),你最好的选择将使用EventMachine。使用EventMachine提供了一种简单的方法来执行非阻塞IO。

还可以查看EM-Synchrony了解一组支持Ruby 1.9光纤的客户端(包括HTTP)。

所有你需要一个非阻塞HTTP请求做的是一样的东西:

require "em-synchrony" 
require "em-synchrony/em-http" 
EM.synchrony do 
    concurrency = 2 
    urls = ['http://url.1.com', 'http://url2.com'] 

    # iterator will execute async blocks until completion, .each, .inject also work! 
    results = EM::Synchrony::Iterator.new(urls, concurrency).map do |url, iter| 

     # fire async requests, on completion advance the iterator 
     http = EventMachine::HttpRequest.new(url).aget 
     http.callback { iter.return(http) } 
     http.errback { iter.return(http) } 
    end 

    p results # all completed requests 
    EventMachine.stop 
end 

古德勒克!

0

看一看创建每个请求作为后台作业: http://blog.heroku.com/archives/2009/7/15/background_jobs_with_dj_on_heroku/

更“工人”你的Heroku,更多的后台作业可以同时处理购买,让你的“DYNOS”服务用户。

+0

将它作为后台作业的问题是,dj将挂起的作业保存在数据库中,因此,将进程添加到队列中,然后用户必须等到其中一个工作人员查询数据库以查看哪个作业正在等待,然后执行。因此,除了查询API的等待时间外,我还要等待员工开始工作。这就是为什么我认为这不是最好的选择..但我可能是错的。 – acadavid 2010-11-03 18:12:46

+0

作为替代方案,您可以使用typhoeus(https://github.com/pauldix/typhoeus)并行运行请求。 – gjb 2010-11-03 18:22:09

2

你总是可以使用Javascript来制作请求客户端。那么你不仅可以并行运行它们,而且你甚至不需要往返自己的服务器。

+0

如果我们不需要某种API密钥,我们只能跳过往返,对吗?否则,我们需要首先访问服务器,因为我们无法在客户端上存储API密钥。 – 2012-03-22 16:16:00