指南

为大批量处理任务设置合理的超时时间

一个对单次地址查询来说完全够用的超时值,会在服务器处理完所有条目之前,远远提前切断一个包含几千个条目的批量请求。这看起来像是失败,但只要给足时间,请求本来是可以完成的。

为什么批量请求需要更多时间

批量数组中的每个条目本身都是一次查询,因此一个包含 2,000 个条目的请求,其处理量大约是单次查询的 2,000 倍,尽管从您这边看它只是一次 HTTP 调用。对单个地址来说合理的一两秒超时,对于这种规模的请求远远不够。

根据批次规模调整超时

请按照所发送数组的大小按比例设置客户端超时,并为常见的波动留出一些余量,而不是对代码发出的每个请求(无论大小)都使用同一个固定值。

timeout_seconds = max(5, item_count * 0.05)

这只是一个起点,需要根据您自己观察到的情况进行调整,而不是一个可以视为权威的固定数值,因为每个条目的实际处理时间并不是公开承诺的保证。

优先使用较小的分块,而不是一个巨大的请求

与其为了容纳越来越大的单个请求而不断调高超时值,不如把一个非常大的任务拆分成每块几百到几千个条目的分块。较小的分块需要的超时更短、更可预测,而中途失败只会损失当前分块,而不是整个任务。

处理确实发生的超时

如果请求在您这边确实超时了,您可能无法知道服务器实际上是否已经处理完毕。与其盲目地重新提交同一个分块(如果原请求其实已经完成,这可能会在您的配额中重复计数),不如查看最近一次成功调用返回的配额响应头,估计超时的分块是否可能已经处理,然后谨慎地重新提交。

超时设置不影响费用

超时纯粹是客户端设置,决定您愿意等待多久。无论您的客户端是等满了全部时长还是提前放弃,它都不会影响请求的费用,仍然是每处理一个条目计一次请求。

让超时与批次大小相匹配,并优先使用多个较小的分块而不是一个非常大的请求,可以让大型任务既可靠,又能在出问题时轻松恢复。关于大型任务的分块和配额策略,速率限制文档中有进一步介绍。