微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

向 Google Maps Geocoding API 发送许多请求的正确方法是什么?

如何解决向 Google Maps Geocoding API 发送许多请求的正确方法是什么?

我的目标是将大量地址地理编码为 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 毫秒,这已经非常慢了。然后我会重复 OVER_QUERY_LIMIT 请求,超时时间为 2000 毫秒。结果很奇怪:

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

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

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

解决方法

相关问题:

见:

本节:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?