2017-10-13 60 views
0

我试图推出相同的10个目标到大量的网站。我将目标存储在toAddArray中,并且在循环中,他们将根据当前网站的目标数量创建或更新目标。首先我创建批处理,然后循环添加目标到批处理中(因为写操作没有失败,所以省略了目标代码),然后执行批处理。谷歌分析管理API Java包批次不工作

代码我正在

 //Create batch from Analytics Object 
     BatchRequest b = analytics.batch(); 
     // in loop determine create or update based off current Goal list size 
     FOR LOOP IS HERE 
     if(y < currentSize) 
      { 
       //some code for inserting the goal 
       analytics.management().goals().update(ACTIVE_ACCOUNT_ID, ACTIVE_PROPERTY_ID, ACTIVE_PROFILE_ID, String.valueOf(y+1), toAddArray[y]).queue(b, setCallback("Successfully Added Goal")); 
      } 
      else{ 
       // Some code for when I update the goal 
       // Send to queue 
       analytics.management().goals().insert(ACTIVE_ACCOUNT_ID, ACTIVE_PROPERTY_ID, ACTIVE_PROFILE_ID, toAddArray[y]).queue(b, setCallback("Successfully Added Goal")); 
      } 

      FOR LOOP ENDS 
      //Execute the batch 
      b.execute(); 

发生什么事

当我运行此我得到了10个进球的回调,第5-6回来的成功和最后4将返回超出限额。据我所知,批处理系统的要点是将URL编译成一个命中并一次发送,以减少服务器的负载。

这个系统似乎更像是一个排队系统,它有它的位置,但不能帮助我减少我正在使用的写入次数。由于我正在为1000个左右的网站编写10个目标,因此我正在寻找每天写10k个网站。每个项目每天有500个写入限制,这使得它成为20天的事情。如果我只有每个配置文件的写入,这将是一个2天的事情。我要求Google团队增加我的API配额,并将目标更新测试版访问权限添加到另外5个项目中,以便我可以开始切换密钥,但在此期间,我想了解是否有某件事我可以做批量处理作为一个单一的写作工作。

回答

0

使用批处理的性能增益仅被称为权限(user management docs)。

我相信你说得对,当你说打电话的时候就好像你一次只做一个电话一样。当您一次发送10个电话时,您可能会收到配额错误。我猜它是1.5qps per Account ID write limit

如果你需要做许多写你可能需要implement exponential backoff.

我希望这可以帮助,祝你好运:)

+0

感谢您的回答乔希。在过去,我一直用自己的“队列”来击打命中,然后推动这个过程定期休眠,以达到API限制。 [这里](https://developers.google.com/analytics/devguides/config/mgmt/v3/batching)是“最佳实践”页面的链接,它详细介绍了如何将它用于许多操作和旨在减少API的点击次数。它看起来好像这个Java类实际上并不使用队列来生成HTTP请求并将它们批处理在一起。我自己会这样做,并提出要求。 –