2010-11-03 45 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