【问题标题】:Google API throwing Rate Limit Exceeded 403 exception for CDN cache invalidationGoogle API 为 CDN 缓存失效抛出 Rate Limit Exceeded 403 异常
【发布时间】:2020-06-04 11:57:45
【问题描述】:

我们正在 Google CDN 中缓存我们的页面和内容。

Google 为我们提供了一个 API,可以使特定页面/路径的缓存失效。

我们的网站是使用称为 AEM(Adobe Experience Manager)的 CMS 构建的,该 CMS 支持不断的页面/内容更新,例如。我们可能会在一天内更新两次https://our-webpage/homepage.html 上显示的内容。完成此类操作后,需要刷新 Google CDN 中 "homepage.html" 的缓存。

这种活动很常见,这意味着我们需要在一天内发送几个缓存失效请求(数千个)。

我们发送了如此多的失效请求,以至于一段时间后我们收到此错误

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "Rate Limit Exceeded",
    "reason" : "rateLimitExceeded"
  } ],
  "message" : "Rate Limit Exceeded"
}

我们如何解决这个问题?

我已阅读此页面https://developers.google.com/drive/api/v3/handle-errors

它提到了批处理请求。

如何将多个页面的失效请求一次性发送到 Google CDN?

或者是否可以将 API 刷新调用限制增加或设置为每天更高的数量。

现在,如果我们有 100 个页面要从 CDN 刷新,我们会进行 100 次以下 HTTP 调用(每个页面一个)。

    CacheInvalidationRule requestBody = new CacheInvalidationRule();

        // IMPORTANT 
        requestBody.setPath(pagePath);

        Compute computeService = createComputeService();
        Compute.UrlMaps.InvalidateCache request =
                computeService.urlMaps().invalidateCache(projectName, urlMap, requestBody);
        Operation response = request.execute();

        if(LOG.isDebugEnabled()) {
            LOG.debug("Google CDN Flush Response JSON :: {}",response);
        }
    LOG.info("Google CDN Flush Invalidation for Page Path {}:: Response Status Code:: {}",pagePath,response.getStatus());

我们将页面设置为刷新requestBody.setPath(pagePath);

我们能否以一种更有效的方式来做到这一点,例如在一次 HTTP 调用中将所有页面作为数组或字符串发送?

喜欢:

requestBody.setPath(pagePath);

在哪里

pagePath="['/homepage.html','/videos.html','/sports/basketball.html','/tickets.html','/faqs.html']";

【问题讨论】:

    标签: java google-api aem


    【解决方案1】:

    Rate Limit Exceeded 是洪水保护,您将快速减慢您的请求。

    为重试请求实施指数回退。

    您可以在越来越长的时间内定期重试失败的请求,以处理与速率限制、网络容量或响应时间相关的错误。例如,您可能会在一秒后重试失败的请求,然后在两秒后重试,然后在四秒后重试。这种方法称为指数退避,用于提高带宽使用率并最大化并发环境中的请求吞吐量。使用指数退避时,请考虑以下事项:

    • 在出现错误后至少一秒开始重试周期。
    • 如果尝试的请求引入了更改,例如创建请求,请添加检查以确保没有重复。重试请求无法解决某些错误,例如无效的授权凭据或“找不到文件”错误。

    批处理不会对您有多大帮助,您仍然会受到与速率限制相同的问题的限制,我什至在批处理时看到了速率限制错误。

    请注意,您的链接来自 Google drive api,我什至不确定 Cloud CDN 是否支持批量请求。

    【讨论】:

    • 请注意您的链接来自 Google drive api 我什至不确定 Cloud CDN 是否支持批量请求。
    【解决方案2】:

    在 AEM 端聚合多个更新并在最大时间段和/或最大更改量后仅向 CDN 发送一个请求不是更好吗? 我的意思是,如果您在 AEM 上更改主页,通常也会使所有子页面无效(导航可能会更改,...)。

    google cdn 是否有可能使树或子树无效? 至少这就是我将从该文档中提取的内容https://cloud.google.com/sdk/gcloud/reference/compute/url-maps/invalidate-cdn-cache

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2013-12-15
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      相关资源
      最近更新 更多