2016-01-19 46 views
0

我通過使用RestClient庫的應用程序獲取Google API請求以獲取地址。使用Net :: HTTP的API請求生產速度很慢

樣品請求代碼 -

require 'rest-client' 
require 'json' 

gmaps_api_href = "https://maps.googleapis.com/maps/api/geocode/json?latlng=18.56227673,73.76804232&language=ar" 
response = RestClient.get gmaps_api_href 
result = JSON.parse(response)['results'] 

這個請求工作得很好我的本地計算機上,它1-2secs內完成。但在生產實例中,需要20秒才能完成一個請求。

由於一些安全措施,我們無法直接訪問生產實例。所以我無法找到這個延遲的關鍵點。 做試驗和錯誤後,我們發現,

  1. 如果我們要求使用curl,需要1秒的服務器
  2. 如果我們使用的Net :: HTTP請求做,它需要20秒才能完成一樣,我們觀察RestClient。
  3. 如果我們在小的.net應用程序中使用WebRequest發出請求,該請求將在1秒內完成。

我很難得到上述觀察的區別。

請讓我知道爲什麼是這樣?以及我必須做些什麼才能使其在我的Rails應用程序中工作?

+1

相關問題,建議,我認爲可能是您的服務器上的DNS問題:http://stackoverflow.com/questions/29945204/nethttp-extremely-slow-responses-for-https-requests http://stackoverflow.com/questions/9939726/ruby-net-http-opening-connection-very-slow –

+0

感謝喬丹!爲什麼WebRequest在服務器上正常工作還有一件事?有什麼區別嗎? – kd12

+0

Ruby的Net :: HTTP和.NET的WebRequest之間確實存在差異,就像Net :: HTTP和cURL之間的差異一樣。但是,這些差異是什麼,我不能說。 –

回答

0

您使用的是Google API密鑰嗎?您的示例沒有顯示使用API​​密鑰。如果沒有,我猜你會受到Google的限制。在您的服務器上,您可能已經部署了此應用程序的一個版本,該應用程序在最近一段時間內沒有提供API密鑰就向Google發出了很多請求,而Google注意到了這一點,它的限速軟件可能會減慢您的請求該服務器。儘管您的本地機器過去並未向Google API提出大量請求,但並未受到谷歌服務器的限制。

Google的速率限制可能會引起User-Agent的注意(現在!),而Curl發送的不同用戶代理以某種方式避開了由RestClient發送的請求觸發的Google速率限制用戶代理(和RestClient可能使用net-http,並且具有與它相同的用戶代理)。

雖然有人會希望如果你是受限速的,你會得到一個「429太多請求」的錯誤響應,而不僅僅是一個緩慢的響應,這可能是RestClient隱藏你的(我沒有使用RestClient) ,而且我還看到一些來自Google限速防禦的不可預知的行爲,特別是在服務上不使用API​​密鑰的情況下,除了少數示例請求外,其他所有服務都只需要一個API密鑰。我已經看到類似於你在這種情況下報告的東西。

我的猜測是你受限速,因爲你沒有使用API​​密鑰。從Google獲取並使用API​​密鑰。當你使用API​​密鑰時,Google仍然有費率限制,但是他們明顯是廣告(免費,每天2500個,每秒不超過10個,如果你付費的話更多),並且應該給出更清晰和可預測的錯誤消息超標。這就是爲什麼Google需要API密鑰的原因之一,所以他們可以通過明確的方式可靠地限制您的速度。

https://developers.google.com/maps/documentation/geocoding/usage-limits https://developers.google.com/maps/documentation/geocoding/intro#BYB

+0

我們已經訂購了額外的使用限制,在這裏,usuage限制不是問題,請求比我們的測試環境延遲了很多。 – kd12

+0

您是否在大學/企業「企業」網絡中?您的本地網絡防火牆和保護可以限制您的速率嗎? – jrochkind