google-api - Google Calendar API 在单个批处理请求中返回 403 R

我的应用程序代表用户创建和删除 Google 日历事件。每个用户都通过 OAuth 门户进行授权,并且该用户的 access_token 用于访问 API,而不是服务帐户。

我遇到了各种速率限制错误的问题,所以我开始批量请求。但是尽管批处理请求,批处理中的许多请求都会失败。只有我在本地对此进行测试 - 该服务上没有其他用户。

例如,您可以在下面看到批量请求中的几个删除失败(编号 2、6、7、8 等)。这个带有 ~12 个 delete 请求的批处理请求是前几分钟发送的唯一内容,并且在前一个小时内可能有 6 个批处理请求(许多具有相同的问题)。

如果我随后立即触发另一个批处理请求,我会看到相同的模式:几个子请求成功而其他的失败。这让我相信我没有超过任何类型的全局/基于天的限制,而是批处理请求本身存在问题。

[2020-08-03 13:55:03,101: WARNING/ForkPoolWorker-1] Error with batch delete request "1": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,102: WARNING/ForkPoolWorker-1] Error with batch delete request "3": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,102: WARNING/ForkPoolWorker-1] Error with batch delete request "4": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,103: WARNING/ForkPoolWorker-1] Error with batch delete request "5": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,103: WARNING/ForkPoolWorker-1] Error with batch delete request "6": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,103: WARNING/ForkPoolWorker-1] Error with batch delete request "9": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">
[2020-08-03 13:55:03,103: WARNING/ForkPoolWorker-1] Error with batch delete request "10": <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/X.com_X%40group.calendar.google.com/events/X? returned "Rate Limit Exceeded">

(X 是我编辑的个人信息)

在某种程度上它是有帮助的,这里是导致这个的非常基本的代码:

batch = c.new_batch_http_request(callback=batch_delete_callback)
for event in events:
    if event is not None:
        r = c.events().delete(calendarId=gcal_id, eventId=event)
        batch.add(r)
batch.execute()

回调:

def batch_delete_callback(request_id, response, exception):
    if exception is not None:
        print('Error with batch delete request "{0}": {1}'.format(
            request_id, exception))

我在这里做错了什么以及如何最好地处理或避免这些来自 Google 的 403?

更新

我只是尝试对此进行最低限度的测试,以获得立即失败的案例。我运行了一个批处理请求,将 12 个事件添加到我的日历中,然后运行一个批处理请求,试图在大约 15 秒后删除这 12 个相同的事件。所以只有 2 个批处理请求,每个请求有 12 个子请求。这是在我上次尝试后 20 小时内没有任何操作之后。

在 12 个 delete 请求中,有 8 个失败了。所以我有 12 个 create 请求成功,然后 8/12 个 delete 请求返回了 403 Rate Limit Exceeded

正如我在下面的评论中所指出的,我的控制台显示的配额是每位用户每天 1,000,000 次查询和每 100 秒 100,000,000 次查询。所以我只是不知道我达到了什么限制。

最佳答案

批处理减少了请求总数,但速率限制仍然适用

  • 实际上,批处理时,您的代码执行速度更快,您更有可能遇到速率限制问题。
  • 您需要减慢代码执行速度或在开发者控制台中请求增加配额。

在 documentation 中推荐以下程序避免 403 Rate Limit Exceeded 错误:

Suggested actions:

  • Raise the per-user quota in the Developer Console project.
  • If one user is making a lot of requests on behalf of many users of a G Suite domain, consider a Service Account with authority delegation (setting the quotaUser parameter).
  • Use exponential backoff.

关于google-api - Google Calendar API 在单个批处理请求中返回 403 Rate Limit Exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63237115/

相关文章:

laravel - 如何在 Laravel 中显示带有法语符号的验证消息?

angular - 在 Angular 10 中将 HTML 转换为 PDF

reactjs - 在 Jest 中测试 Axios

python-3.x - 无论如何,您是否可以检查 Azure CLI 在后台执行哪些 API 调用

python - 如何使用 Elasticsearch-dsl 在 Django 中进行并行测试?

android - 使用 Jetpack Navigation 在深度链接 URI 中使用字符串常量

firebase - 如何将复杂的 Firestore 查询卸载到 Firebase Cloud F

php - 使用 Laravel 的 Eloquent 将数据发送到数据库的问题

python - Django 信号卡在循环中

java - 使用 Spring WebClient 重复过滤响应