速率限制

Google Ads API 会按每个客户帐号的客户 ID (CID) 和开发者令牌的每秒查询次数 (QPS) 对速率限制请求进行分桶,这意味着系统会针对 CID 和开发者令牌单独强制执行计量。Google Ads API 使用令牌桶算法对请求进行计量,并确定适当的 QPS 限制,因此,确切的限制会因任意给定时间的服务器总负载而异。

实施速率限制的目的是防止某个用户有意或无意地发出大量请求,给 Google Ads API 服务器带来过重负担,从而中断其他用户的服务。

违反速率限制的请求将被拒绝,并显示以下错误:RESOURCE_TEMPORARILY_EXHAUSTED

您可以通过主动减少请求数量和从客户端限制 QPS 来控制应用并降低速率限制。

有许多方法可以降低超出速率限制的几率。 熟悉企业集成模式 (EIP) 概念(如消息传递、重新传递和限流)可帮助您构建更强大的客户端应用。

下面列出了一些推荐的做法,排在前面的是比较简单的策略,后面的则是比较强大但复杂的架构:

限制并发任务数

导致速率超限的一个根本原因是客户端应用产生了过多的并行任务。虽然我们不限制客户端应用可以产生多少并行请求,但这样做很容易超出开发者令牌层面的每秒请求数限制。

我们建议对所有进程和机器上将会发送请求的并行任务总数设置合理的上限,并以之为基础向上调整,从而在不超出速率限制的情况下优化吞吐量。

此外,您可以考虑从客户端限制 QPS(请参阅限流和使用速率限制器)。

批处理请求

请考虑在单个请求中批量处理多项操作。这最适用于 MutateFoo 调用。例如,如果您要更新多个 AdGroupAd 实例的状态 - 您可以调用 MutateAdGroupAds 一次并传入多个 operations,而不是为每个 AdGroupAd 调用一次 MutateAdGroupAds。如需查看更多示例,请参阅我们的批量操作指南

虽然批量发送请求可以减少请求总数,并减缓超出“每分钟请求数”速率限制的情况,但如果您对单个账号执行大量的操作,还是可能会触发“每分钟操作数”速率限制。

限流和使用速率限制器

除了在客户端应用中限制线程总数之外,您还可以在客户端实施速率限制器。这可以确保跨进程和 / 或集群的所有线程都受到客户端特定的 QPS 限制的约束。

您可以试试 Guava 速率限制器,或为集群环境实现自己的基于令牌桶的算法。例如,您可以生成令牌并将其存储在共享的事务性存储空间(如数据库)中,每个客户端在处理请求之前都必须先获取和使用令牌。如果令牌用完,客户端必须等待生成下一批令牌。

队列

消息队列是用于分配操作负载的解决方案,同时还可以控制请求和使用者速率。可用的消息队列方案有许多:一些是开源的,一些是专有的,而且其中许多都支持各种不同的语言。

在使用消息队列时,您可以有多个推送消息到队列的生成者和多个处理这些消息的使用者。限流可在使用者一端实施,方法是限制并发使用者的数量,或者为生成者或使用者实施速率限制器或限流器。

例如,如果消息使用者遇到速率限制错误,则该使用者可以将请求返回到要重试的队列。同时,该使用方也可以通知所有其他使用方暂停处理几秒钟,以便从错误中恢复。