历史上的高错误率会导致 Google 日历 API 超时吗?

Can historical high error rates cause Google Calendar APIs to timeout?

最近一个月或更长时间,我们发现读取超时错误数量激增,以至于我们似乎无法弄清楚。我们研究了 DNS 缓存(确保我们不会访问陈旧的 A 记录),我们尝试了不同的 HTTP 传输(例如 ApacheHttpTransportNetHttpTransport),并且我们尝试了超时范围5 秒、20 秒(默认)和 60 秒。

这似乎无关紧要:任何写入操作(我们大量使用 PATCH)似乎都有约 30-40% 的机会导致超时。这似乎发生在我们所有的用户身上(1000 多个,所以它不仅仅局限于某些 Google 个帐户)。我们使用指数退避,99.9% 的时间我们的请求最终通过,但延迟让我们的用户感到沮丧。我们还尽可能使用 If-Match headers。

我 运行 不知道是什么原因造成的。虽然我们在 1 月份首次推出产品时偶尔会遇到超时和 500 错误,但我们没有观察到任何接近此级别的故障。

我确实想到了一个想法:由于我们产品的性质,我们可以进行大量 API 调用,从而导致各种错误。例如,我们经常在不知道它们是否已被删除的情况下发出删除事件请求,从而导致“410 gone”响应。

所以... Google 的 API 是否可以 "penalize" 你如果你打太多电话它不喜欢并且,而不是速率限制我们或发送一些其他结构化错误,只是决定使套接字超时?

我找到了我的痛苦的原因,这真是太棒了。在尝试了不同的帐户和 user-agent headers 以及任何可以排除我们的特定请求有问题的方法之后,我完全切换到另一个客户端库。

经过反复试验,我将范围缩小到官方 Google Calendar API 客户端库默认为传出请求启用 GZIP 压缩。当我关闭它时,突然间一切都超级流畅。

图表 A:

显然,我认为通常在两个方向上进行 gzip 压缩会很棒。但如果它引起我所看到的那种头痛,那就不行了!我们将通过 Google 提交错误报告。我的直觉是 Content-Length header 在某些情况下可能设置得有点错误,导致请求挂起。奇怪的是,使用相同的负载重试效果很好,但我想每次都可能有小的变体(例如:时间戳、访问令牌等)。