google-apps-script - UrlFetchApp 服务超时
问题描述
urlfetch 允许的数据有限,因此为了加载大型 CSV 或 TSV 文件(50K),我创建了一个代理服务器(REST),它在后台发出请求,将其映射到列表并缓存 6 小时。然后,我添加了一个端点来根据范围获取数据(见下面的签名)
签名:var PROXY = ' http://lagoja-services.rcb.co.il/api/adwordsProxy/feed/ {base64URL}/{seperator}/{from}/{to}'
当有人到达范围端点时,我会即时创建一个 CSV。在服务器上第一次加载这个大文件需要 60-80 秒,其他后续请求从缓存中获取内容,因此只需要 2 秒。
我遇到的问题是使用 urlfetch 内置类在 60 秒后超时,因此它交替工作(有时它工作,有时会出现超时异常)没有办法减少第一次加载!
似乎我无法控制客户端超时(出于某种未知原因)
对我来说还有其他解决方案吗?
谢谢,罗比(-:
嗨,我为您创建了一个专用的“测试”端点来重现该问题。此端点每次都尝试加载大量文件(无缓存)
function main() {
var response = UrlFetchApp.fetch('http://lagoja-services.rcb.co.il/api/adwordsProxy/test');
var status_code = response.getResponseCode();
Logger.log('status code %s', status_code);
}
端点: http: //lagoja-services.rcb.co.il/api/adwordsProxy/test
例外:超时: http: //lagoja-services.rcb.co.il/api/adwordsProxy/test
大家好,我找到了一个解决方案(我当然不喜欢),但我没有更好的建议。
这个想法是 ping 服务器以获取文件,等到它加载到缓存中,然后请求加载的内容......一个糟糕的解决方案,但至少它可以工作大声笑
接口:
[HttpGet]
[Route("api/fire")]
public HttpResponseMessage FireGetCSVFeed(...) {
HostingEnvironment.QueueBackgroundWorkItem(async ct => {
// make a request to the original CSV file - takes 60-80 seconds
});
return Request.CreateResponse(HttpStatusCode.OK, "Working...");
}
广告词脚本:
function sleep(milliseconds) {
var start = new Date().getTime();
while (new Date().getTime() < start + milliseconds);
}
function main() {
var response = UrlFetchApp.fetch(baseURL + 'fire');
sleep(1000 * 120); // yes i know, i'm blocking everything )-:
response = UrlFetchApp.fetch(baseURL + 'getCSV');
status_code = response.getResponseCode();
Logger.log('status code %s', status_code);
}