javascript - 为什么Google Geocoding即使在计费和通话之间存在延迟的情况下仍能提供OVER_QUERY_LIMIT?

标签 javascript google-maps google-maps-api-3

背景

我在一个涉及网站的项目中,该网站假设在高峰负载下有200K +用户,并使用用户指定城市中的纬度/经度对执行一些业务逻辑,而其UI则要求他们提供该城市中的地址,这意味着该网站需要将后者转换为前者,因此该团队决定将Google Maps Geocoding与客户端Javascript结合使用。

由于他们认为自己的数据库不够强大,无法缓存结果,因此他们决定不缓存任何内容,这意味着所有用户输入都将始终使用该API进行转换,因此,我被要求执行负载测试以每天对其进行测试启用Google API密钥和计费的配额限制。

设定

据我所知,还有一个速率限制,当达到任何一个限制时都会抛出OVER_QUERY_LIMIT,我在Geocoding API调用之间添加了1秒的延迟,这意味着每秒将调用一次。当返回OVER_QUERY_LIMIT时,我还添加了30秒的延迟,这意味着此类失败的请求将仅在30秒后重试。

我的测试结果如下:


连续410次成功呼叫-> OVER_QUERY_LIMIT->延迟30秒
连续78次成功呼叫-> OVER_QUERY_LIMIT->延迟30秒
连续20次成功通话-> OVER_QUERY_LIMIT->延迟30秒
连续16次成功通话-> OVER_QUERY_LIMIT->延迟30秒
连续12次成功呼叫-> OVER_QUERY_LIMIT->延迟30秒
少于10次连续成功呼叫-> OVER_QUERY_LIMIT-> 30秒延迟
最终达到了增加30秒延迟实际上会降低吞吐量的地步


我还测试了,在没有第30个延迟的情况下,到达第一个OVER_QUERY_LIMIT时,后续调用只是在成功和OVER_QUERY_LIMIT之间交替,最终使它在1个成功和10个以上OVER_QUERY_LIMIT之间交替。

此外,我尝试将Geocoding API调用之间的延迟增加到2秒,而将OVER_QUERY_LIMIT上的延迟增加到60秒,但是结果令人惊讶地相似。尽管我可能还希望进一步显着增加这些限制,但是这种增加很可能会导致延迟变得太长而无法实现,因此我决定不再进行测试。

尽管我无法公开调用API的代码,但它们基本上只是使用google.maps.Geocoder.geocode函数,同时将结果始终限制在该城市。

尽管他们不太在意帐单,我告诉他们应该准备改用溢价,但我们也同意,现在仅测试每日配额限制是不值得的。



我已经在该网站上阅读了Optimizing Quota Usage When GeocodingWhat happens if I exceed the usage limits和许多类似的问题,但是似乎没有一个问题与我的情况相近,所以我想知道为什么,即使API调用和计费之间存在延迟启用后,实际测试结果甚至远远低于2500个免费每日限制,更不用说启用了计费功能的100K了吗?

如果答案是负载测试本身在滥用Google API,那么还有其他方法可以可靠地验证Google API速率限制和每日配额限制的确高度可靠吗?

编辑

我忘了提一下,当我刷新页面时,Google API调用将返回250-300个连续的成功结果,然后才会与以前的测试结果具有相同的行为,但是我只会将刷新作为最后的手段。

在检查API Manager控制台中的流量后,Google Maps JavaScript API仅有几个请求(我认为这些请求是用于加载Google Map本身),而Google Maps Geocoding API根本没有任何请求,尽管我已经调用了如今,通过google.maps.Geocoder.geocode的Google Geocoding API已经有数千次了。

好像没有使用API​​密钥,但是浏览器返回了一条错误消息,当我不提供API密钥时,没有提供Google API密钥。

由于现在浏览器根本不返回任何错误消息,我只能认为Google API密钥应该可以正常工作,而仪表板流量却恰恰相反。我不知道发生了什么,也非常感谢任何帮助。

我使用过google.maps.version,它说我使用的是3.27.12版本。

最佳答案

在与团队进行了数小时的调查和讨论之后,我认为唯一可行的解​​决方案是结合使用客户端浏览器代码和服务器端Web服务代码。

然后,大多数请求将在客户端处理,但是对于返回OVER_QUERY_LIMIT的此类请求,将在服务器端重试。

这是因为根据我在互联网上(特别是this one)所读的内容,客户端API调用的主要障碍是速率限制,而服务器端API调用的主要障碍是每日限制。

在上述组合下,每日限制将主要通过客户端API调用来缓解,而速率限制将主要通过服务器端API调用来缓解,这意味着它们有效地覆盖了彼此的限制。

尽管如此,我仍然想知道是否还有更好的方法可以真正解决根本原因,而不是在使事情变得非常复杂的同时避免发生此问题。

关于javascript - 为什么Google Geocoding即使在计费和通话之间存在延迟的情况下仍能提供OVER_QUERY_LIMIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43360375/

相关文章:

javascript - Google Maps API - OVER QUERY LIMIT 每秒限制

javascript - 从 Actionscript 检测 Javascript 的可用性?

google-maps - Google Place Autocomplete 附加到 div

javascript - 配置文件脚本未正确显示

javascript - Google Maps API 3 - 限制平移/ map 边界

android - android 中的 Geocoder 有时会在某些设备上给出 "Service not available error"。如何处理?

android - 如何扩展来自 Google map 的共享位置 URL?

javascript - 如何使用 C# 在谷歌地图中进行地理围栏

javascript - 如何使用 javascript 获取学年

javascript - 如何添加ajax参数?