为什么第一次响应在GAS网络应用中花费更多时间?

时间:2019-07-10 10:21:12

标签: google-apps-script

编辑:我正在使用表扣。将代码更新为实际的GAS!

我已将GAS部署为网络应用。我们通过Slash命令从Slack发送POST请求,由于GAS无法处理异步代码,因此它需要在不到3000毫秒的时间内做出响应。

在第一个请求上,发送响应需要花费3000毫秒以上的时间,但在随后的请求上,大约需要1500毫秒。

doPost函数如下所示。

var exports = exports || {};
var module = module || { exports: exports };
Logger = BetterLog.useSpreadsheet('spreadsheetId');
function doPost(request) {
    var startExecutionDate = new Date();
    var path = request.parameter.path;
    Logger.log("Request received with path: " + path);
    var response = Responses.Error;
    var token = request.parameter.token;
    if (path.startsWith('/slack')) {
        Logger.log("Slack request");
        var slackRouter = new SlackRouter();
        response = slackRouter.post(request);
        // ...
    }
    // ...
}

这是Slack路由器的代码。

var exports = exports || {};
var module = module || { exports: exports };
var SlackRouter = (function () {
    function SlackRouter() {
    }
    SlackRouter.prototype.post = function (request) {
        var path = request.parameter.path;
        switch (path) {
            case Routes.Team:
                Logger.log("For team");
                // ...
        }
    };
    return SlackRouter;
}());
exports.SlackRouter = SlackRouter;

我有每个日志的时间戳。

第一次尝试

| Timestamp    | Delta in ms | Log Message   |
|--------------|-------------|---------------|
| 11:22:34:164 | 0           | Path: ...     |
| 11:22:35:354 | 1190        | Slack request |
| 11:22:35:462 | 108         | For team      |

第二次尝试

| Timestamp    | Delta in ms | Log Message   |
|--------------|-------------|---------------|
| 11:22:45:047 | 0           | Path: ...     |
| 11:22:45:164 | 117         | Slack request |
| 11:22:45:350 | 186         | For team      |

我已经有了一些想法,就像Web应用程序进入睡眠状态一样,但是由于我们从第一条日志消息中计算出增量,因此没有任何意义。

那么幕后发生了什么?您知道任何简单的解决方法吗?如果可能的话,我不想构建一个微服务来及时向Slack发送响应,然后再发送实际响应。

3 个答案:

答案 0 :(得分:0)

最明显的问题是您在doPost()方法中使用了ES6语法。

Google Apps脚本不支持ES6模板字符串语法,仅部分支持解构分配。所以这可能是您的问题。您的{{1}}可能无法返回值,因此Slack可能会重复请求直到超时。

答案 1 :(得分:0)

尝试删除BetterLog库。这可能会导致最初的首次延迟。 https://developers.google.com/apps-script/guides/libraries

警告:如果所有代码都包含在一个脚本项目中,那么使用库的脚本的运行速度将不如它快。尽管库可以使开发和维护更加方便,但是您应该在速度至关重要的项目中谨慎使用它们。由于这个问题,应该限制附件中的库使用。

答案 2 :(得分:0)

  

Apps Script服务器不会将编写或部署的每个脚本都加载到内存中,因此,有一段时间未运行的脚本需要首先从磁盘加载。在云提供商中,这通常称为“冷启动时间”。

Eric KoledaGoogle Apps Script Community forum上得到了