我的谷歌脚本网络应用程序最近达到了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团队询问配额。他们向我解释说,没有公布的同时执行的配额/限制,如有更改,恕不另行通知。他们建议进一步使用cacheService和更好的错误处理。
我认为从长轮询转为短轮询。但这感觉就像缺点。我应该尝试进一步优化性能还是转向其他服务?
尝试使用&#34;执行app作为用户访问应用程序&#34;救命? (用户应使用相同的数据库)
Google Script API可执行文件与Web App不同吗?看起来它可能适合,但我不确定它们是否共享相同的qps配额。
我也在考虑GAE服务,但我想避免超过免费配额。
任何建议都将不胜感激!
答案 0 :(得分:2)
我认为可以改进以下部分。从缓存服务检索数据时,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])];
由于我看不到您的数据,我无法确认此执行情况。因此,如果发生错误,请告诉我。
如果我误解了你的问题,我很抱歉。