Google Apps Script Web App 长轮询和同时执行限制

Google Apps Script Web App long-polling and simultaneous executions limit

我的 google 脚本网络应用最近达到了 qps 限制。什么是提高性能的更好方法。

我有大约 50 个活跃用户。我使用 15,000 行 google 电子表格作为数据库,我的应用正在提供用户从该电子表格请求的 json 数据。我使用长轮询使连接保持活动状态 5 分钟,如果电子表格中没有更新,则关闭它。然后客户端重新连接。发布 Web App 以我的身份执行。

我的投票是这样的:

function doGet(e){
    var userHasVersion = e.parameter.userVersion
    while (runningTime < 300001) {
          var currentServerVersion = parseInt(cache.get("currentVersion"),10)
          if(userVersion<currentServerVersion){
            var returndata = []
            for(var i = userVersion+1; i <= currentServerVersion;i++){
              var newData = cache.get(i)
              if(newData!=null){returnData.push(JSON.parse(cache.get(newData)))}
            }
            return ContentService.createTextOutput(JSON.stringify({currentServerVersion,data:returnData })).setMimeType(ContentService.MimeType.JSON); 
          } else {
            Utilities.sleep(20000)
          }
          runningTime = calculateRunningTime()
    }
}

到目前为止我尝试过的:

1) 我使用 CacheService 优化了请求以减少对 Spreadsheet 的调用。它帮助了几个月,但现在我越来越频繁地收到 qps 错误。

2) 向 Google 团队询问配额。他们向我解释说,没有针对同时执行的已发布 quotas/limits,它们如有更改,恕不另行通知。他们建议进一步使用 cacheService 和更好的错误处理。

我想从长轮询切换到短轮询。但这感觉像是缺点。我应该尝试进一步优化性能还是转向其他服务?

尝试使用 "execute app as user accessing the app" 会有帮助吗? (用户应使用相同的数据库)

Google 脚本 API 可执行文件与 Web 应用程序不同吗?看起来可能合适,但我不确定它们是否共享相同的 qps 配额。

我也在考虑 GAE 服务,但我想避免超出免费配额。

任何建议将不胜感激!

我认为下面的部分可以改进。从缓存服务中检索数据时,getAll()get() 更有效。我曾经测量过差异。这比 get() 快大约 890 倍。如果从缓存服务中获取的数据量很大,我认为这部分的改进对性能很重要。

您的脚本:

var returndata = []
for(var i = userVersion+1; i <= currentServerVersion;i++){
  var newData = cache.get(i)
  if(newData!=null){returnData.push(JSON.parse(cache.get(newData)))}
}

改进脚本:

var ar = [];
for(var i = userVersion+1; i <= currentServerVersion;i++){
  ar.push([i]);
}
var r = JSON.parse(JSON.stringify(cache.getAll(ar))); // Since key is number, I used this.
var returnData = [r[j] for each (j in r)if (!r[j])];

由于看不到你的数据,我无法确认这次执行。所以如果出现错误,请告诉我。

如果我误解了你的问题,我很抱歉。