2016-01-19 45 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