当前位置: 首页 > 知识库问答 >
问题:

为什么以及如何是配额"临界读取请求"超过时,使用batchCreate联系人

冯飞鹏
2023-03-14

我正在使用Google People API编程一个从数据库到Google contacts的联系人导出。我正在通过谷歌应用程序脚本通过URL编程请求。

下面的代码-使用https://people.googleapis.com/v1/people:batchCreateContacts-适用于13到15个单一请求,但谷歌会返回以下错误消息:

超出配额指标临界读取请求(联系人和个人资料读取)的配额,并限制每个用户每分钟的临界读取请求(联系人和个人资料读取)服务people.googleapis.com的用户project_number:***。

为了提高速度,我用10个并行请求批量发送请求。

关于这个问题,我有以下两个问题:

  1. 为什么,为了创建联系人,我会点击一个关于读取请求的配额?
  2. 鉴于下面的图片链接,为什么发送2批10个同时请求(更准确地说:13到15个单个请求)会达到这个量子限制?每个用户每分钟90个读取请求的量子限制显示在console.cloud.google.com

谢谢你的任何澄清!

进一步阅读:https://developers.google.com/people/api/rest/v1/people/batchCreateContacts

  let payloads = [];
  let lengthPayloads;
  let limitPayload = 200;
/*Break up contacts in payload limits*/
  contacts.forEach(function (contact, index) /*contacts is an array of objects for the API*/
    {
      if(!(index%limitPayload))
      {
        lengthPayloads = payloads.push(
          {
            'readMask': "userDefined",
            'sources': ["READ_SOURCE_TYPE_CONTACT"],
            'contacts': []
          }
        );
      }
      payloads[lengthPayloads-1]['contacts'].push(contact);
    }
  );
Logger.log("which makes "+payloads.length+" payloads");
  let parallelRequests = [];
  let lengthParallelRequests;
  let limitParallelRequest = 10;
/*Break up payloads in parallel request limits*/
  payloads.forEach(function (payload, index)
    {
      if(!(index%limitParallelRequest))
        lengthParallelRequests = parallelRequests.push([]);
      parallelRequests[lengthParallelRequests-1].push(
        {
          'url': "https://people.googleapis.com/v1/people:batchCreateContacts",
          'method': "post",
          'contentType': "application/json",
          'payload': JSON.stringify(payload),
          'headers': { 'Authorization': "Bearer " + token }, /*token is a token of a single user*/
          'muteHttpExceptions': true
        }
      );
    }
  );
Logger.log("which makes "+parallelRequests.length+" parallelrequests");
  let responses;
  parallelRequests.forEach(function (parallelRequest)
    {
      responses = UrlFetchApp.fetchAll(parallelRequest); /* error occurs here*/
      responses = responses.map(function (response) { return JSON.parse(response.getContentText()); });
      
      responses.forEach(function (response)
        {
          if(response.error)
          {
            Logger.log(JSON.stringify(response));
            throw response;
          }
          else Logger.log("ok");
        }
      );

日志输出:

这使得22个有效载荷

产生3个并行请求

好(15次)

(错误信息)

共有2个答案

史鸿运
2023-03-14

超出配额指标临界读取请求(联系人和个人资料读取)的配额,并限制每个用户每分钟的临界读取请求(联系人和个人资料读取)服务people.googleapis.com的用户project_number:***。

配额有两种类型:基于项目的配额和基于用户的配额。基于项目的配额是对项目本身的限制。基于用户的报价更像是防洪措施,它们限制单个用户在一段时间内可以发出的请求数量。

当您发送一个包含10个请求的批处理请求时,它将计为10个请求,而不是单个批处理请求。如果您试图运行这个并行程序,那么每用户每分钟的请求配额肯定会溢出。

慢下来这不是比赛。

为什么,为了创建联系人,我会达到关于读取请求的配额?

我会把它塞到一个错误消息中。

鉴于下面的图片链接,为什么发送13到15个请求会达到配额限制?((此代码之前有3个读取请求))控制台上显示的每用户每分钟90个读取请求的配额限制。云谷歌。通用域名格式

你每分钟发送13*10=130,这将超过每分钟的请求。也无法知道您的系统运行的速度,因为这取决于服务器在收到您的请求时所做的其他事情,以及它们实际记录的时间。

我的建议是只尊重配额限制,而不是试图理解为什么谷歌服务器上有太多的变量来确定一分钟到底是多少。你可以在10秒内发送100个请求,然后尝试在55秒内再发送100个请求,你会得到错误。65秒后你也可能会得到错误,这取决于请求何时到达服务器,以及服务器何时处理完最初的100个请求。

再慢下来。

松钟展
2023-03-14

我在谷歌的问题跟踪器中提出了同样的问题。

看起来单个BatchCreateContact或BatchUpdateContact调用每个请求消耗六(6)个“关键读取请求”配额。仍然没有得到一个答案,为什么对于创建/更新联系人,我们达到了关键读取请求的限制。

 类似资料:
  • 问题内容: 创建ajax请求时,GET over POST有什么优势,反之亦然?我如何知道在任何给定时间应该使用哪个?这是安全意识的决定吗? 此外,实际发送方式有何不同? 问题答案: POST请求是您不想意外发生的请求。GET请求是您可以通过用户通过URL指向浏览器来进行的请求。 GET请求可以非常简单地重复,因为它们的数据基于URL本身。 您应该像考虑常规表单请求(及其GET和POST)一样考虑

  • 问题内容: 抱歉,如果我有点模棱两可,但是我试图了解使用Node.js而不是其他服务器端语言的真正优势。 我是JavaScript爱好者,所以我可能会玩Node.js,但我想知道是否应该在项目中使用它。 问题答案: 在V8上发生了异步非阻塞I / O 构建。 因此,我们拥有了Google JavaScript解释器V8的所有性能提升。由于JavaScript性能竞赛尚未结束,您可以期望Google

  • 问题内容: 我参与开发一个Java项目,该项目使用一些C ++组件,因此我需要Jacob.dll。(在Windows 7上) 无论我把Jacob.dll放在哪里,我都在不断获取。 我在寻找可能的决定,而到目前为止尚未尝试的决定是设置LD_LIBRARY_PATH变量,指向.dll文件。 我经验不足,不熟悉该变量的含义和用法-您能帮我吗? 问题答案: 通常,您必须在JVM的命令行上进行设置:

  • 问题内容: 我的应用程序当前将Spring Session与Redis一起用作后端。 我搜索了Spring Session 的官方文档,但使用该模块时找不到默认的会话超时。 另外,我不确定如果需要如何更改默认超时。 有人可以请教吗? 问题答案: 使用Redis存储库时配置会话超时的最简单方法是 当存储库中不再有会话时,该会话将 过期 。可以同时在和上配置超时。默认值为 30分钟 。 如果您使用的是

  • 问题内容: 有人向我解释什么和是谁? 我感到困惑的用例都和。 如果您还可以包括一段代码来进行解释,那将是很好的。谢谢! 问题答案: 的目标和是抽象不同的方式来输入和输出:流是一个文件,网页,或者屏幕不应该的事。重要的是您从流中接收信息(或将信息发送到该流中。) 用于阅读许多内容。 用于写很多东西。 这是一些示例代码。它假定和已经创建:

  • 问题内容: 经常出现在Python模块中。即使阅读了Python的文档,我也不明白它的用途以及使用时间/方式。 有人可以举例说明吗? 关于我收到的基本用法的一些答案似乎是正确的。 但是,我需要了解有关工作原理的另一件事: 对我来说,最令人困惑的概念是当前的python版本如何包含未来版本的功能,以及如何使用当前版本的Python成功地编译使用未来版本的功能的程序。 我猜想当前版本包含了将来的潜在功