【问题标题】:What is the proper way of sending many requests to Google Maps Geocoding API? [duplicate]向 Google Maps Geocoding API 发送许多请求的正确方法是什么? [复制]
【发布时间】:2021-04-28 15:27:29
【问题描述】:

我的目标是将大量地址地理编码为LatLng 对象。 我只能使用 Google,不能使用其他可能支持批处理请求的 API。 因此我必须使用 1 个请求 = 1 个地址,但我不断收到OVER_QUERY_LIMIT。不知道这怎么可能,因为从official docs 开始,我应该能够在客户端每秒对 50 个地址进行地理编码。

我的第一个想法是一次发出 50 个请求,等待所有请求返回,暂停一秒,然后继续处理接下来的 50 个地址......所以简化的代码如下所示:

const geocoder = new google.maps.Geocoder();
const allAddresses = [ /* 500 addresses */ ];
geocodeAddresses(allAddresses);

function geocodeAddresses(addresses) {
  const last50 = addresses.splice(-50);
  Promise.allSettled(
    last50.map((address) =>
      new Promise((resolve, reject) =>
        geocoder.geocode({
          address
        }, (results, status) => {
          console.log("Geocoded! Response: " + status);
          resolve();
        })))
  ).then(() =>
    setTimeout(() => geocodeAddresses(addresses), 1000)
  );
}

此代码一次成功返回前 10 个请求,然后由于配额限制而在其他请求上失败(为什么?)。

所以我决定一次处理 1 个请求,每个结果后延迟 500 毫秒,这已经非常慢了。然后我会以 2000 毫秒的超时重复 OVER_QUERY_LIMIT 请求。结果很奇怪:

  • 前 ~200 个请求都正常
  • 接下来约 50 个请求:重复约 10 个请求
  • 接下来的约 30 个请求:重复约 15 个请求
  • 接下来约 10 个请求:重复约 10 个请求(每个请求在成功之前都失败了)

在完成约 350 个请求后,每个请求都失败了 5-6 次,而且速度真的很慢。看起来它可能会成倍地失败。

用 Google 对我的所有地址进行地理编码的最快方法是什么?谢谢!

【问题讨论】:

标签: javascript google-maps google-geocoding-api


【解决方案1】:

相关问题:

见:

本节:

Managing errors and retries

如果您收到 OVER_QUERY_LIMIT 状态代码作为响应,则您的 API 有 exceeded the usage limits。我们建议您尝试这些usage optimization strategies

速率限制
地理编码服务的速率限制为 50 QPS(每秒查询数),计算为客户端和服务器端查询的总和。

Web 服务的文档中有一个建议:Best Practices Using Google Maps APIs Web Services 使用 Exponential Backoff

指数退避
在极少数情况下,在满足您的要求时可能会出现问题;您可能会收到 4XX 或 5XX HTTP 响应代码,或者 TCP 连接可能只是在您的客户端和 Google 服务器之间的某处失败。通常值得重新尝试请求,因为当原始请求失败时,后续请求可能会成功。但是,重要的是不要简单地循环重复向 Google 的服务器发出请求。这种循环行为可能会使您的客户端和 Google 之间的网络过载,从而导致多方出现问题。

更好的方法是重试,增加尝试之间的延迟。通常,每次尝试都会使延迟增加一个乘法因子,这种方法称为Exponential Backoff

【讨论】:

  • 相关问题没有帮助,事实上,它根本不起作用,与指数退避无关。我意识到谷歌不适合批量地理编码,除非有人愿意为几百个位置等待一整天。仍然不明白 Google 的速率限制设置为 50 QPS,而它远低于该值。
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
相关资源
最近更新 更多