首页 > 解决方案 > 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);
}

标签: google-apps-scriptgoogle-ads-api

解决方案


推荐阅读