使用Net :: HTTP的API请求在生产中非常慢

时间:2016-01-19 06:32:45

标签: ruby-on-rails ruby ruby-on-rails-4 rubygems

我正在使用RestClient库通过应用程序发出Google 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-2秒内完成。但是在生产实例上,完成一个请求需要20秒。

由于一些安全措施,我们无法直接访问生产实例。所以我无法找到这个延迟的针脚点。 经过反复试验,我们发现了

  1. 如果我们使用CURL发出请求,则服务器上需要1秒
  2. 如果我们使用Net :: HTTP发出请求,则完成与我们在RestClient中观察到的相同需要20秒。
  3. 如果我们在小型.net应用程序中使用WebRequest发出请求,则该请求将在1秒内完成。
  4. 我难以区分上述观察结果。

    请让我知道为什么会这样?我需要做些什么改变才能使它在我的Rails应用程序中运行?

1 个答案:

答案 0 :(得分:0)

您使用的是Google API密钥吗?您的示例未显示API密钥的使用。如果没有,我猜你会受到谷歌的限制。在您的服务器上,您可能已经部署了此应用的一个版本,在最近的一段时间内向Google发出了大量请求而没有API密钥,Google注意到并且它的速率限制软件可能是减慢从该服务器发出的请求。虽然您的本地计算机过去没有向google api发出大量请求,但谷歌的服务器不受速率限制。

可能谷歌的速率限制正在引起用户代理的注意(现在!),而Curl发送的不同用户代理以某种方式逃避谷歌的速率限制这是由RestClient发送的用户代理发送的请求触发的(而RestClient可能会使用net-http,并且具有与之相同的User-Agent)。

虽然人们希望如果你受到限制,你会得到一个" 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