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])];
由于看不到你的数据,我无法确认这次执行。所以如果出现错误,请告诉我。
如果我误解了你的问题,我很抱歉。
我的 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])];
由于看不到你的数据,我无法确认这次执行。所以如果出现错误,请告诉我。
如果我误解了你的问题,我很抱歉。