2014-09-27 123 views
1

這個問題有兩個部分快速REST調用執行

第1部分

我需要進行批量REST API調用的第三方API,即每小時各地300K,所以什麼是最好的方式來優化我的代碼及時獲得/管理響應。正如在一個測試中,我試圖生成1000個線程,並在下面的代碼中調用以在最短時間內獲得響應,但結果非常令人失望。一些電話響應成功,但許多電話返回超時錯誤。

 HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet("http://www.example.com"); 

     HttpResponse response; 
     response = client.execute(httpGet); 
     System.out.println(response.getStatusLine().getStatusCode()); 
     HttpEntity entity = response.getEntity(); 
     String result = getStringFromInputStream(entity.getContent()); 

我知道,超時錯誤可能是由於服務器端,但例如服務器返回的響應,我所有的1000線5分鐘的時間內做出反應,那麼我仍無法達到每小時300K電話。其次,我可以用其他方式優化此代碼嗎?

第2部分

我與Java嘗試這樣做,我只是好奇,想知道它會給出更好的結果,如果我用Java以外的語言?即javascript/python/PHP?

更新1個

我的系統規格爲進行

  • 的Ubuntu 14.04 64位
  • 4GB內存
  • 500 GB硬盤
  • 英特爾®酷睿™i5-2430M的CPU測試@ 2.40GHz×4
  • Internet連接= 1 MB :(

更新2

我的服務器規格進行未來/測試實用

  • 美分OS 6.5
  • 1 GB RAM
  • 1個CPU核心
  • 40千兆網絡在
  • 125 Mbit網絡輸出:)

請指導。謝謝。

+0

問題是限制因素不是系統的速度,而是連接帶寬。因此,在paralel中執行更多的線程會使每個http請求變得更慢,最終它會花費相同的時間。 – Gumbo 2014-09-27 21:03:22

+0

問題不是你的調用代碼,而是可能是服務器。使用Jetty和Java的NIO類,我們能夠每小時提供比您所談論的更多的請求。我想我們需要更多的信息來告訴你正在調用什麼系統以及請求和響應的大小 – Leon 2014-09-28 12:00:16

回答

0

要使用python實現每小時300k個請求,我會推薦使用類似Celery的東西。你可以在Y服務器+一個調度器上輕鬆產生X進程,每小時增加30萬個任務。

我正在使用Celery和RabbitMQ來運行網站性能測試和2-3臺服務器,我很快就能夠在幾分鐘內發送20k請求。

+0

Celery是不是像[Quartz Scheduler](http://quartz-scheduler.org/)?如果是的話哪個更好? – iConfused 2014-09-27 20:42:27

+0

我從來沒有使用Quartz Scheduler,但它看起來像cron,而芹菜遠不止於此。 Celery調度程序只是整個程序包的一部分。 – pm007 2014-09-27 22:42:59

1

我只嘗試回答你的問題的一部分,1

你得到超時(或可能拒絕連接例外),因爲你正在爲你的HttpClient創建的每個實例打開一個新的套接字,並有限制了您的操作系統將創建的套接字數量。如果您正在linux上運行,您可能會注意到,您將擁有數百個處於CLOSE_WAIT狀態的套接字,只有在VM的垃圾收集運行時纔會關閉套接字。

嘗試像這樣創建一個httpClient實例,並且不要在每次希望進行http調用時都創建一個新的httpclient實例。

ClientConnectionManager mgt = new ThreadSafeClientConnManager(); 
    DefaultHttpClient httpClient = new DefaultHttpClient(mgt); 
+0

我的理解是,我們可以增加多達65k的套接字數量,並且改變文件描述符,並且是每次創建新實例都需要大量時間,但通過創建單個實例我認爲它不會解決我的問題問題。 – iConfused 2014-09-27 20:32:11