处理没有随机 Utilities.sleep 的 UrlFetch 速率限制的正确方法?

Proper way to deal with UrlFetch rate limit without random Utilities.sleep?

我们的 Google 表格插件为用户提供了一个扩展的函数库。

问题是,每个函数 运行 都执行 UrlFetch。因此,如果用户将列向下拖动 > 100 次,他们可能会看到错误:"Error: Service invoked too many times in a short time: urlfetch".

显然,一个常见的解决方案是在 UrlFetch 函数之前添加一个随机的休眠位(例如 https://productforums.google.com/forum/#!topic/docs/_lgg9hbU6k8)。但是没有其他办法解决这个问题吗?在随机睡眠测试后,我可能会增加一次限制到 200 个函数,最大值。

潜在的问题是我不知道限制到底是什么。例如,当 Google 的队列中同时有 > 100 个 UrlFetch 请求时,速率限制是否达到?我试图真正了解我们的选择是什么,但甚至没有完全了解限制!

非常感谢您的帮助,特别是如果您来自 Google:)。

你的问题"is it when there's > 100 UrlFetch requests at once in Google's queue that the rate-limit hits?"的答案基本是否定的。限制不是 100 次调用。

如果满足以下条件之一,您将看到该错误 ("Error: Service invoked too many times in a short time: urlfetch"):

  • 每分钟通过 urlfetch 发送或接收 22 MB 的数据
  • 每分钟拨打 3,000 次或更多次
  • ...或者如果您达到每日最大值。通话费和数据费..

在你的情况下,听起来你在达到每日数据最大值或每日通话最大值之前收到了错误消息,所以它可能是每分钟数据条件:每分钟通过 urlfetch 发送或接收 22 MB。

可以不断检查您正在通过 urlfetch 处理的字节数并使用它,如果它接近限制,则让函数休眠一分钟。但是,这有点烦人。

您可能需要考虑尝试提高函数的效率,从而减少发送的数据或进行的调用。 如何执行此操作在很大程度上取决于功能,我们需要查看代码以在那里提出具体建议。

您可以在此处找到 Google 的配额:https://cloud.google.com/appengine/docs/quotas#UrlFetch