Google 日历 API 设有配额,以确保所有用户都能公平地使用该 API。 使用 Google 日历 API 时,有三个重要的限制需要考虑:
- 系统会按项目和用户强制执行 API 使用配额。如需了解详情,请参阅下一部分。
- 一般日历使用量限制:避免超出日历使用量限制。
- 操作限制:您随时都可能会受到速率限制。例如,如果您尝试快速连续写入单个日历。
Google 日历 API 用量配额的类型
系统会强制执行两种类型的配额:
- 每个项目每分钟:这是您的 Google Cloud 项目发出的请求数。
- 每位用户每分钟的项目请求数:这是 Cloud 项目中任何一位特定用户发出的请求数。此限制旨在帮助您确保在用户之间公平分配使用量。
配额是按分钟使用滑动窗口计算的,因此如果在一分钟内出现的流量激增超出了您的每分钟配额,则会导致在下一个滑动窗口期间出现速率限制,以确保您的平均使用量保持在配额范围内。
如果超出任一配额,系统会对您的查询施加速率限制,并返回 403 usageLimits
状态代码或 429 usageLimits
状态代码。如果出现这种情况,您可以执行以下操作:
- 请务必遵循所有最佳实践:使用指数退避算法、对流量模式进行随机化、使用推送通知。
- 如果您的项目在不断发展,并且您有更多用户,可以申请增加每个项目的配额。
- 如果达到了每位用户的配额上限,您可以执行以下操作:
申请增加配额
如需查看或更改项目的用量限制,或申请增加配额,请按以下步骤操作:
- 如果您的项目还没有结算账号,请创建一个。
- 在 API 控制台中访问 API 库中的“已启用的 API”页面,然后从列表中选择一个 API。
- 如需查看和更改配额相关设置,请选择配额。如需查看用量统计信息,请选择使用量。
使用指数退避算法
当我们希望您降低请求速率时,会返回 403“usageLimits”响应或 429 响应(请参阅完整错误文档)。这不是严重错误,您应该在短时间后重试该请求。如果请求仍过于频繁,我们会再次询问,以此类推。为了使此方法正常运行,请务必让请求之间的延迟时间随着时间的推移而增加。
通常,您应使用截断指数退避算法;Cloud Storage 文档对此做法及其首选算法进行了详细说明。如果您使用的是 Google 客户端库,系统通常会为您处理此问题;请参阅库文档。通常,您应使用库实现,而不是自行编写。
随机化流量模式
日历客户端容易出现由多个客户端同时执行操作导致的流量模式尖峰。例如,日历客户端的一个常见错误做法是在午夜执行完整同步。这几乎肯定会导致超出每分钟配额,并导致速率限制和回退。
为避免出现这种情况,请尽可能确保您的流量分散在一天中的各个时间段。如果您的客户需要每天进行同步,请让客户确定一个随机时间(每个客户不同)。如果您需要定期执行操作,请将间隔时间调整为 +/- 25%。这样可以更均匀地分配流量,并提供更好的用户体验。
使用推送通知
一个常见的用例是,每当用户日历中发生变化时执行操作。这里的反模式是重复轮询每个感兴趣的日历。这会非常快地耗尽您的所有配额。例如,如果您的应用有 5,000 位用户,并且每分钟轮询每个用户的日历一次,那么即使在执行任何工作之前,每分钟配额也需要至少为 5,000 次。
服务器端应用可以注册接收推送通知,以便我们在发生感兴趣的事情时通知您。这些功能需要进行更多设置工作,但可以显著提高配额的使用效率,并提供更好的用户体验。请务必指定您希望接收通知的 eventType
。如需了解详情,请参阅推送通知。
使用服务账号进行正确的会计核算
如果您的应用使用全网域授权执行请求,系统会默认按“每分钟每项目每位用户”配额对服务账号收费,而不是按您所冒充的用户收费。这意味着,即使服务账号可能在多个用户的日历中运行,也可能会耗尽配额并受到速率限制。您可以使用 quotaUser
网址参数(或 x-goog-quota-user
HTTP 标头)指明要向哪位用户收费,以避免出现这种情况。此值仅用于配额计算。如需了解详情,请参阅 Cloud 文档中的限制每位用户的请求数量。
测试配额限制处理
为确保您的应用能够在实际中妥善处理达到配额限制的情况(例如通过使用指数退避算法进行重试),并尽可能减少对用户造成的任何潜在干扰,我们强烈建议您在真实环境中测试此场景。
为了避免此类测试干扰您的真实应用使用情况,我们建议您在 Google API 控制台中注册一个单独的仅用于测试的项目,并以与生产项目类似的方式对其进行配置。然后,您可以为此项目设置人为偏低的配额,并观察应用的行为。
价格
对 Google Calendar API 的所有使用均无需额外付费。超出配额请求限制不会产生额外费用,您的账号也不会产生扣款。