在达到限制之前监控密钥用量
随时关注配额响应头,就能在请求真正被拒绝之前,提前知道何时即将达到限制。
一个对单次地址查询来说完全够用的超时值,会在服务器处理完所有条目之前,远远提前切断一个包含几千个条目的批量请求。这看起来像是失败,但只要给足时间,请求本来是可以完成的。
批量数组中的每个条目本身都是一次查询,因此一个包含 2,000 个条目的请求,其处理量大约是单次查询的 2,000 倍,尽管从您这边看它只是一次 HTTP 调用。对单个地址来说合理的一两秒超时,对于这种规模的请求远远不够。
请按照所发送数组的大小按比例设置客户端超时,并为常见的波动留出一些余量,而不是对代码发出的每个请求(无论大小)都使用同一个固定值。
timeout_seconds = max(5, item_count * 0.05)这只是一个起点,需要根据您自己观察到的情况进行调整,而不是一个可以视为权威的固定数值,因为每个条目的实际处理时间并不是公开承诺的保证。
与其为了容纳越来越大的单个请求而不断调高超时值,不如把一个非常大的任务拆分成每块几百到几千个条目的分块。较小的分块需要的超时更短、更可预测,而中途失败只会损失当前分块,而不是整个任务。
如果请求在您这边确实超时了,您可能无法知道服务器实际上是否已经处理完毕。与其盲目地重新提交同一个分块(如果原请求其实已经完成,这可能会在您的配额中重复计数),不如查看最近一次成功调用返回的配额响应头,估计超时的分块是否可能已经处理,然后谨慎地重新提交。
超时纯粹是客户端设置,决定您愿意等待多久。无论您的客户端是等满了全部时长还是提前放弃,它都不会影响请求的费用,仍然是每处理一个条目计一次请求。
让超时与批次大小相匹配,并优先使用多个较小的分块而不是一个非常大的请求,可以让大型任务既可靠,又能在出问题时轻松恢复。关于大型任务的分块和配额策略,速率限制文档中有进一步介绍。